@seedgrid/fe-components 2026.3.20 → 2026.3.27

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 (174) hide show
  1. package/dist/buttons/SgFloatActionButton.d.ts.map +1 -1
  2. package/dist/buttons/SgFloatActionButton.js +5 -26
  3. package/dist/buttons/SgSplitButton.d.ts.map +1 -1
  4. package/dist/buttons/SgSplitButton.js +3 -1
  5. package/dist/buttons/fab-helpers.d.ts +6 -0
  6. package/dist/buttons/fab-helpers.d.ts.map +1 -0
  7. package/dist/buttons/fab-helpers.js +29 -0
  8. package/dist/commons/SgAvatar.d.ts.map +1 -1
  9. package/dist/commons/SgAvatar.js +6 -3
  10. package/dist/commons/SgBadge.d.ts.map +1 -1
  11. package/dist/commons/SgBadge.js +5 -2
  12. package/dist/commons/SgToast.d.ts.map +1 -1
  13. package/dist/commons/SgToast.js +3 -1
  14. package/dist/commons/SgToaster.d.ts.map +1 -1
  15. package/dist/commons/SgToaster.js +3 -1
  16. package/dist/environment/SgEnvironmentProvider.d.ts.map +1 -1
  17. package/dist/environment/SgEnvironmentProvider.js +10 -15
  18. package/dist/environment/persistent-state.d.ts +22 -0
  19. package/dist/environment/persistent-state.d.ts.map +1 -0
  20. package/dist/environment/persistent-state.js +33 -0
  21. package/dist/gadgets/calendar/SgCalendar.d.ts.map +1 -1
  22. package/dist/gadgets/calendar/SgCalendar.js +5 -23
  23. package/dist/gadgets/clock/SgClock.d.ts.map +1 -1
  24. package/dist/gadgets/clock/SgClock.js +12 -10
  25. package/dist/gadgets/clock/themes/SgClockThemePicker.d.ts +2 -1
  26. package/dist/gadgets/clock/themes/SgClockThemePicker.d.ts.map +1 -1
  27. package/dist/gadgets/clock/themes/SgClockThemePicker.js +23 -28
  28. package/dist/gadgets/clock/themes/search.d.ts +9 -0
  29. package/dist/gadgets/clock/themes/search.d.ts.map +1 -0
  30. package/dist/gadgets/clock/themes/search.js +15 -0
  31. package/dist/gadgets/gauge/SgLinearGauge.d.ts.map +1 -1
  32. package/dist/gadgets/gauge/SgLinearGauge.js +39 -28
  33. package/dist/gadgets/gauge/SgRadialGauge.d.ts.map +1 -1
  34. package/dist/gadgets/gauge/SgRadialGauge.js +44 -37
  35. package/dist/gadgets/gauge/math.d.ts +90 -0
  36. package/dist/gadgets/gauge/math.d.ts.map +1 -0
  37. package/dist/gadgets/gauge/math.js +81 -0
  38. package/dist/gadgets/qr-code/SgQRCode.d.ts.map +1 -1
  39. package/dist/gadgets/qr-code/SgQRCode.js +3 -1
  40. package/dist/i18n/en-US.d.ts.map +1 -1
  41. package/dist/i18n/en-US.js +99 -1
  42. package/dist/i18n/es.d.ts.map +1 -1
  43. package/dist/i18n/es.js +155 -57
  44. package/dist/i18n/fr.d.ts +3 -0
  45. package/dist/i18n/fr.d.ts.map +1 -0
  46. package/dist/i18n/fr.js +208 -0
  47. package/dist/i18n/index.d.ts +5 -1
  48. package/dist/i18n/index.d.ts.map +1 -1
  49. package/dist/i18n/index.js +50 -14
  50. package/dist/i18n/pt-BR.d.ts.map +1 -1
  51. package/dist/i18n/pt-BR.js +99 -1
  52. package/dist/i18n/pt-PT.d.ts.map +1 -1
  53. package/dist/i18n/pt-PT.js +99 -1
  54. package/dist/index.d.ts +12 -2
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +10 -2
  57. package/dist/inputs/SgAutocomplete.d.ts +1 -1
  58. package/dist/inputs/SgAutocomplete.d.ts.map +1 -1
  59. package/dist/inputs/SgAutocomplete.js +7 -4
  60. package/dist/inputs/SgCheckboxGroup.d.ts +2 -6
  61. package/dist/inputs/SgCheckboxGroup.d.ts.map +1 -1
  62. package/dist/inputs/SgCheckboxGroup.js +6 -6
  63. package/dist/inputs/SgCombobox.d.ts.map +1 -1
  64. package/dist/inputs/SgCombobox.js +11 -2
  65. package/dist/inputs/SgDatatable.d.ts.map +1 -1
  66. package/dist/inputs/SgDatatable.js +10 -10
  67. package/dist/inputs/SgInputBirthDate.d.ts.map +1 -1
  68. package/dist/inputs/SgInputBirthDate.js +6 -1
  69. package/dist/inputs/SgInputCNPJ.d.ts +3 -1
  70. package/dist/inputs/SgInputCNPJ.d.ts.map +1 -1
  71. package/dist/inputs/SgInputCNPJ.js +4 -3
  72. package/dist/inputs/SgInputCPF.d.ts +3 -1
  73. package/dist/inputs/SgInputCPF.d.ts.map +1 -1
  74. package/dist/inputs/SgInputCPF.js +8 -3
  75. package/dist/inputs/SgInputCPFCNPJ.d.ts +3 -1
  76. package/dist/inputs/SgInputCPFCNPJ.d.ts.map +1 -1
  77. package/dist/inputs/SgInputCPFCNPJ.js +8 -3
  78. package/dist/inputs/SgInputCurrency.d.ts +3 -7
  79. package/dist/inputs/SgInputCurrency.d.ts.map +1 -1
  80. package/dist/inputs/SgInputCurrency.js +5 -2
  81. package/dist/inputs/SgInputDate.d.ts.map +1 -1
  82. package/dist/inputs/SgInputDate.js +6 -1
  83. package/dist/inputs/SgInputEmail.d.ts.map +1 -1
  84. package/dist/inputs/SgInputEmail.js +1 -1
  85. package/dist/inputs/SgInputNumber.d.ts +3 -7
  86. package/dist/inputs/SgInputNumber.d.ts.map +1 -1
  87. package/dist/inputs/SgInputNumber.js +5 -2
  88. package/dist/inputs/SgInputOTP.d.ts +5 -12
  89. package/dist/inputs/SgInputOTP.d.ts.map +1 -1
  90. package/dist/inputs/SgInputOTP.js +7 -4
  91. package/dist/inputs/SgInputPassword.d.ts.map +1 -1
  92. package/dist/inputs/SgInputPassword.js +1 -1
  93. package/dist/inputs/SgInputPhone.d.ts +3 -1
  94. package/dist/inputs/SgInputPhone.d.ts.map +1 -1
  95. package/dist/inputs/SgInputPhone.js +2 -1
  96. package/dist/inputs/SgInputPostalCode.d.ts.map +1 -1
  97. package/dist/inputs/SgInputPostalCode.js +2 -1
  98. package/dist/inputs/SgInputSelect.d.ts +4 -2
  99. package/dist/inputs/SgInputSelect.d.ts.map +1 -1
  100. package/dist/inputs/SgInputSelect.js +38 -3
  101. package/dist/inputs/SgInputText.d.ts +3 -7
  102. package/dist/inputs/SgInputText.d.ts.map +1 -1
  103. package/dist/inputs/SgInputText.js +5 -2
  104. package/dist/inputs/SgInputTextArea.d.ts +4 -2
  105. package/dist/inputs/SgInputTextArea.d.ts.map +1 -1
  106. package/dist/inputs/SgInputTextArea.js +37 -2
  107. package/dist/inputs/SgOrderList.d.ts +3 -1
  108. package/dist/inputs/SgOrderList.d.ts.map +1 -1
  109. package/dist/inputs/SgOrderList.js +24 -8
  110. package/dist/inputs/SgPickList.d.ts +3 -1
  111. package/dist/inputs/SgPickList.d.ts.map +1 -1
  112. package/dist/inputs/SgPickList.js +33 -17
  113. package/dist/inputs/SgRadioGroup.d.ts +2 -6
  114. package/dist/inputs/SgRadioGroup.d.ts.map +1 -1
  115. package/dist/inputs/SgRadioGroup.js +6 -6
  116. package/dist/inputs/SgRating.d.ts +2 -10
  117. package/dist/inputs/SgRating.d.ts.map +1 -1
  118. package/dist/inputs/SgRating.js +6 -3
  119. package/dist/inputs/SgSlider.d.ts +8 -2
  120. package/dist/inputs/SgSlider.d.ts.map +1 -1
  121. package/dist/inputs/SgSlider.js +62 -10
  122. package/dist/inputs/SgStepperInput.d.ts +8 -2
  123. package/dist/inputs/SgStepperInput.d.ts.map +1 -1
  124. package/dist/inputs/SgStepperInput.js +62 -8
  125. package/dist/inputs/SgTextEditor.d.ts +3 -1
  126. package/dist/inputs/SgTextEditor.d.ts.map +1 -1
  127. package/dist/inputs/SgTextEditor.js +30 -16
  128. package/dist/inputs/SgToggleSwitch.d.ts +3 -7
  129. package/dist/inputs/SgToggleSwitch.d.ts.map +1 -1
  130. package/dist/inputs/SgToggleSwitch.js +6 -3
  131. package/dist/layout/SgBreadcrumb.d.ts.map +1 -1
  132. package/dist/layout/SgBreadcrumb.js +7 -3
  133. package/dist/layout/SgCard.d.ts.map +1 -1
  134. package/dist/layout/SgCard.js +3 -1
  135. package/dist/layout/SgCarousel.d.ts.map +1 -1
  136. package/dist/layout/SgCarousel.js +3 -1
  137. package/dist/layout/SgExpandablePanel.d.ts.map +1 -1
  138. package/dist/layout/SgExpandablePanel.js +3 -1
  139. package/dist/layout/SgMenu.d.ts.map +1 -1
  140. package/dist/layout/SgMenu.js +174 -298
  141. package/dist/layout/SgPageControl.d.ts.map +1 -1
  142. package/dist/layout/SgPageControl.js +7 -3
  143. package/dist/layout/SgToolBar.d.ts.map +1 -1
  144. package/dist/layout/SgToolBar.js +19 -55
  145. package/dist/layout/SgTreeView.d.ts.map +1 -1
  146. package/dist/layout/SgTreeView.js +7 -3
  147. package/dist/layout/drag-position.d.ts +7 -0
  148. package/dist/layout/drag-position.d.ts.map +1 -0
  149. package/dist/layout/drag-position.js +30 -0
  150. package/dist/layout/menu-logic.d.ts +187 -0
  151. package/dist/layout/menu-logic.d.ts.map +1 -0
  152. package/dist/layout/menu-logic.js +349 -0
  153. package/dist/layout/toolbar-logic.d.ts +26 -0
  154. package/dist/layout/toolbar-logic.d.ts.map +1 -0
  155. package/dist/layout/toolbar-logic.js +38 -0
  156. package/dist/menus/SgDockMenu.d.ts.map +1 -1
  157. package/dist/menus/SgDockMenu.js +44 -120
  158. package/dist/menus/dock-menu-logic.d.ts +50 -0
  159. package/dist/menus/dock-menu-logic.d.ts.map +1 -0
  160. package/dist/menus/dock-menu-logic.js +113 -0
  161. package/dist/overlay/SgDialog.d.ts.map +1 -1
  162. package/dist/overlay/SgDialog.js +4 -2
  163. package/dist/overlay/SgPopup.d.ts.map +1 -1
  164. package/dist/overlay/SgPopup.js +4 -1
  165. package/dist/rhf.d.ts +8 -3
  166. package/dist/rhf.d.ts.map +1 -1
  167. package/dist/rhf.js +18 -1
  168. package/dist/sandbox.cjs +64 -64
  169. package/dist/wizard/SgWizard.d.ts.map +1 -1
  170. package/dist/wizard/SgWizard.js +20 -32
  171. package/dist/wizard/logic.d.ts +9 -0
  172. package/dist/wizard/logic.d.ts.map +1 -0
  173. package/dist/wizard/logic.js +20 -0
  174. package/package.json +8 -6
@@ -1 +1 @@
1
- {"version":3,"file":"SgPageControl.d.ts","sourceRoot":"","sources":["../../src/layout/SgPageControl.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,MAAM,MAAM,sBAAsB,GAAG;IACnC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAE1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,oBAAoB,CAAC,EAAE,CACrB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,sBAAsB,CAAA;KAAE,KACrD,IAAI,CAAC;IACV,mBAAmB,CAAC,EAAE,CACpB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,sBAAsB,CAAA;KAAE,KACtD,IAAI,CAAC;IAEV,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IAEzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gBAAgB,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC;IACzC,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAE/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B,CAAC;AAiCF,wBAAgB,aAAa,CAAC,KAAK,EAAE,QAAQ,CAAC,kBAAkB,CAAC,2CAmQhE;yBAnQe,aAAa;;;AAuQ7B,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,QAAQ,CAAC,sBAAsB,CAAC,2CAExE;yBAFe,iBAAiB"}
1
+ {"version":3,"file":"SgPageControl.d.ts","sourceRoot":"","sources":["../../src/layout/SgPageControl.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,MAAM,MAAM,sBAAsB,GAAG;IACnC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAE1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,oBAAoB,CAAC,EAAE,CACrB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,sBAAsB,CAAA;KAAE,KACrD,IAAI,CAAC;IACV,mBAAmB,CAAC,EAAE,CACpB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,sBAAsB,CAAA;KAAE,KACtD,IAAI,CAAC;IAEV,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IAEzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gBAAgB,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC;IACzC,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAE/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B,CAAC;AAiCF,wBAAgB,aAAa,CAAC,KAAK,EAAE,QAAQ,CAAC,kBAAkB,CAAC,2CAuQhE;yBAvQe,aAAa;;;AA2Q7B,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,QAAQ,CAAC,sBAAsB,CAAC,2CAExE;yBAFe,iBAAiB"}
@@ -1,6 +1,7 @@
1
1
  "use client";
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import * as React from "react";
4
+ import { t, useComponentsI18n } from "../i18n";
4
5
  function cn(...parts) {
5
6
  return parts.filter(Boolean).join(" ");
6
7
  }
@@ -22,7 +23,10 @@ function clampIndex(index, length) {
22
23
  return Math.max(0, Math.min(length - 1, Math.floor(index)));
23
24
  }
24
25
  export function SgPageControl(props) {
25
- const { children, activePageId, activeIndex, defaultActivePageId, defaultActiveIndex = 0, onActivePageIdChange, onActiveIndexChange, hiddenPageIds, keepMounted = false, pageControlStyle = "underline", size = "md", fullWidthTabs = false, keyboardNavigation = true, ariaLabel = "Page control", emptyMessage = "No visible pages.", className, tabListClassName, tabClassName, panelClassName, style } = props;
26
+ const { children, activePageId, activeIndex, defaultActivePageId, defaultActiveIndex = 0, onActivePageIdChange, onActiveIndexChange, hiddenPageIds, keepMounted = false, pageControlStyle = "underline", size = "md", fullWidthTabs = false, keyboardNavigation = true, ariaLabel, emptyMessage, className, tabListClassName, tabClassName, panelClassName, style } = props;
27
+ const i18n = useComponentsI18n();
28
+ const resolvedAriaLabel = ariaLabel ?? t(i18n, "components.pageControl.ariaLabel");
29
+ const resolvedEmptyMessage = emptyMessage ?? t(i18n, "components.pageControl.empty");
26
30
  const records = React.useMemo(() => resolveRecords(children, hiddenPageIds), [children, hiddenPageIds]);
27
31
  const visiblePages = React.useMemo(() => records.filter((record) => !record.hidden), [records]);
28
32
  const isControlled = activePageId !== undefined || activeIndex !== undefined;
@@ -96,7 +100,7 @@ export function SgPageControl(props) {
96
100
  active: "border-primary text-primary bg-muted/30",
97
101
  inactive: ""
98
102
  };
99
- return (_jsxs("div", { className: cn("w-full", className), style: style, children: [_jsx("div", { role: "tablist", "aria-label": ariaLabel, className: cn("flex min-h-0 items-end gap-1 overflow-x-auto border-b border-border pb-0.5", fullWidthTabs ? "grid auto-cols-fr grid-flow-col" : "", tabListClassName), onKeyDown: (event) => {
103
+ return (_jsxs("div", { className: cn("w-full", className), style: style, children: [_jsx("div", { role: "tablist", "aria-label": resolvedAriaLabel, className: cn("flex min-h-0 items-end gap-1 overflow-x-auto border-b border-border pb-0.5", fullWidthTabs ? "grid auto-cols-fr grid-flow-col" : "", tabListClassName), onKeyDown: (event) => {
100
104
  if (!keyboardNavigation || visiblePages.length === 0)
101
105
  return;
102
106
  const focused = document.activeElement;
@@ -138,7 +142,7 @@ export function SgPageControl(props) {
138
142
  return (_jsxs("button", { ref: (el) => {
139
143
  tabsRef.current[index] = el;
140
144
  }, type: "button", id: tabId, role: "tab", "aria-controls": panelId, "aria-selected": isActive, tabIndex: isActive ? 0 : -1, title: record.props.hint, disabled: record.props.disabled, onClick: () => selectPage(record.id), className: cn("inline-flex shrink-0 items-center justify-center whitespace-nowrap font-medium transition-colors", sizeClasses.tab, tabStyle.base, isActive ? tabStyle.active : tabStyle.inactive, fullWidthTabs ? "w-full" : "", record.props.disabled ? "cursor-not-allowed opacity-45" : "", tabClassName, record.props.tabClassName), children: [record.props.icon ? (_jsx("span", { className: cn("inline-flex items-center justify-center", sizeClasses.icon), children: record.props.icon })) : null, _jsx("span", { className: "truncate", children: record.props.title })] }, record.id));
141
- }) }), _jsx("div", { className: cn("rounded-b-md border border-t-0 border-border bg-background", panelClassName), children: visiblePages.length === 0 ? (_jsx("div", { className: cn(sizeClasses.panel, "text-sm text-muted-foreground"), children: emptyMessage })) : keepMounted ? (visiblePages.map((record) => {
145
+ }) }), _jsx("div", { className: cn("rounded-b-md border border-t-0 border-border bg-background", panelClassName), children: visiblePages.length === 0 ? (_jsx("div", { className: cn(sizeClasses.panel, "text-sm text-muted-foreground"), children: resolvedEmptyMessage })) : keepMounted ? (visiblePages.map((record) => {
142
146
  const isActive = record.id === resolvedActiveId;
143
147
  const tabId = `${rootId}-tab-${record.id}`;
144
148
  const panelId = `${rootId}-panel-${record.id}`;
@@ -1 +1 @@
1
- {"version":3,"file":"SgToolBar.d.ts","sourceRoot":"","sources":["../../src/layout/SgToolBar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAS/B,MAAM,MAAM,oBAAoB,GAAG,YAAY,GAAG,UAAU,CAAC;AAC7D,MAAM,MAAM,6BAA6B,GACrC,aAAa,GACb,eAAe,GACf,iBAAiB,GACjB,kBAAkB,CAAC;AACvB,MAAM,MAAM,iBAAiB,GACzB,SAAS,GACT,WAAW,GACX,SAAS,GACT,MAAM,GACN,SAAS,GACT,MAAM,GACN,QAAQ,GACR,OAAO,CAAC;AAEZ,MAAM,MAAM,aAAa,GAAG;IAC1B,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,oBAAoB,CAAC,EAAE,6BAA6B,CAAC;IACrD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IAExD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAE3C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;IAEjD,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B,CAAC;AAwIF,wBAAgB,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,cAAc,CAAC,2CA8iBxD;yBA9iBe,SAAS;;;AAgjBzB,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,QAAQ,CAAC,wBAAwB,GAAG;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,2CAiJpE;yBAlJe,mBAAmB"}
1
+ {"version":3,"file":"SgToolBar.d.ts","sourceRoot":"","sources":["../../src/layout/SgToolBar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAY/B,MAAM,MAAM,oBAAoB,GAAG,YAAY,GAAG,UAAU,CAAC;AAC7D,MAAM,MAAM,6BAA6B,GACrC,aAAa,GACb,eAAe,GACf,iBAAiB,GACjB,kBAAkB,CAAC;AACvB,MAAM,MAAM,iBAAiB,GACzB,SAAS,GACT,WAAW,GACX,SAAS,GACT,MAAM,GACN,SAAS,GACT,MAAM,GACN,QAAQ,GACR,OAAO,CAAC;AAEZ,MAAM,MAAM,aAAa,GAAG;IAC1B,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,oBAAoB,CAAC,EAAE,6BAA6B,CAAC;IACrD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IAExD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAE3C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;IAEjD,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B,CAAC;AAgFF,wBAAgB,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,cAAc,CAAC,2CAsjBxD;yBAtjBe,SAAS;;;AAwjBzB,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,QAAQ,CAAC,wBAAwB,GAAG;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,2CAiJpE;yBAlJe,mBAAmB"}
@@ -4,6 +4,9 @@ import * as React from "react";
4
4
  import { createPortal } from "react-dom";
5
5
  import { useSgDockLayout } from "./SgDockLayout";
6
6
  import { useHasSgEnvironmentProvider, useSgPersistence } from "../environment/SgEnvironmentProvider";
7
+ import { t, useComponentsI18n } from "../i18n";
8
+ import { buildToolbarStorageKey, parseStoredPanelDragPosition } from "./drag-position";
9
+ import { buildToolbarLayoutState } from "./toolbar-logic";
7
10
  function cn(...parts) {
8
11
  return parts.filter(Boolean).join(" ");
9
12
  }
@@ -52,49 +55,6 @@ const BTN_COLORS = {
52
55
  function clamp(n, min, max) {
53
56
  return Math.max(min, Math.min(max, n));
54
57
  }
55
- function parseStoredDragPosition(raw) {
56
- const value = typeof raw === "string" ? (() => {
57
- try {
58
- return JSON.parse(raw);
59
- }
60
- catch {
61
- return null;
62
- }
63
- })() : raw;
64
- if (!value ||
65
- typeof value !== "object" ||
66
- typeof value.x !== "number" ||
67
- typeof value.y !== "number" ||
68
- !Number.isFinite(value.x) ||
69
- !Number.isFinite(value.y)) {
70
- return null;
71
- }
72
- return {
73
- x: value.x,
74
- y: value.y
75
- };
76
- }
77
- function resolveOrientationDirection(orientationDirection) {
78
- switch (orientationDirection) {
79
- case "horizontal-right":
80
- return { orientation: "horizontal", direction: "left" };
81
- case "horizontal-left":
82
- return { orientation: "horizontal", direction: "right" };
83
- case "vertical-up":
84
- return { orientation: "vertical", direction: "up" };
85
- case "vertical-down":
86
- default:
87
- return { orientation: "vertical", direction: "down" };
88
- }
89
- }
90
- function resolveDockOrientationDirection(orientationDirection, inDock, zone) {
91
- if (!inDock || zone === "free")
92
- return orientationDirection;
93
- if (zone === "top" || zone === "bottom") {
94
- return orientationDirection.startsWith("horizontal") ? orientationDirection : "horizontal-left";
95
- }
96
- return orientationDirection.startsWith("vertical") ? orientationDirection : "vertical-down";
97
- }
98
58
  const SgToolbarOrientationContext = React.createContext("vertical");
99
59
  function useControlledState(args) {
100
60
  const { value, defaultValue, onChange } = args;
@@ -110,6 +70,7 @@ function useControlledState(args) {
110
70
  }
111
71
  export function SgToolBar(props) {
112
72
  const hasEnvironmentProvider = useHasSgEnvironmentProvider();
73
+ const i18n = useComponentsI18n();
113
74
  const { load: loadPersistedState, save: savePersistedState, clear: clearPersistedState } = useSgPersistence();
114
75
  const { id, title, orientationDirection, buttonsPerDirection, bgColorTitle, bgColor, size, className, style, dockZone, draggable = false, freeDrag = false, defaultPosition, collapsible = true, collapsed, defaultCollapsed = false, onCollapsedChange, children } = props;
115
76
  const dock = useSgDockLayout();
@@ -121,9 +82,6 @@ export function SgToolBar(props) {
121
82
  const [dragHoverZone, setDragHoverZone] = React.useState(null);
122
83
  const dragHoverZoneRef = React.useRef(null);
123
84
  const dragPlacementRef = React.useRef(null);
124
- const zoneForOrientation = inDock && !freeDrag && dragHoverZone ? dragHoverZone : effectiveZone;
125
- const resolvedOrientationDirection = resolveDockOrientationDirection(orientationDirection ?? "vertical-down", inDock, zoneForOrientation);
126
- const { orientation, direction } = resolveOrientationDirection(resolvedOrientationDirection);
127
85
  const portalTarget = inDock ? dock.getZoneElement(effectiveZone) : null;
128
86
  const [isCollapsed, setIsCollapsed] = useControlledState({
129
87
  value: collapsed ?? (inDock ? dock.getToolbarCollapsed(id) : undefined),
@@ -134,13 +92,24 @@ export function SgToolBar(props) {
134
92
  dock.setToolbarCollapsed(id, next);
135
93
  }
136
94
  });
95
+ const showContent = !isCollapsed;
96
+ const toolbarLayoutState = buildToolbarLayoutState({
97
+ orientationDirection: orientationDirection ?? "vertical-down",
98
+ inDock,
99
+ zone: effectiveZone,
100
+ freeDrag,
101
+ dragHoverZone,
102
+ effectiveZone,
103
+ showContent
104
+ });
105
+ const { zoneForOrientation, resolvedOrientationDirection, orientation, direction, openUp, openLeft, showLeadingCollapseButton, collapseIconDirection } = toolbarLayoutState;
137
106
  const [dragPos, setDragPos] = React.useState(null);
138
107
  const dragPosRef = React.useRef(null);
139
108
  const [dragActive, setDragActive] = React.useState(false);
140
109
  const dragStart = React.useRef(null);
141
110
  const dragMoved = React.useRef(false);
142
111
  const containerRef = React.useRef(null);
143
- const storageKey = React.useMemo(() => `sg-toolbar-pos:${id}`, [id]);
112
+ const storageKey = React.useMemo(() => buildToolbarStorageKey(id), [id]);
144
113
  const setDragHoverZoneSafe = React.useCallback((next) => {
145
114
  if (dragHoverZoneRef.current === next)
146
115
  return;
@@ -155,7 +124,7 @@ export function SgToolBar(props) {
155
124
  const loaded = await loadPersistedState(storageKey);
156
125
  if (loaded === null || loaded === undefined)
157
126
  return null;
158
- const parsed = parseStoredDragPosition(loaded);
127
+ const parsed = parseStoredPanelDragPosition(loaded);
159
128
  if (!parsed) {
160
129
  await clearPersistedState(storageKey);
161
130
  return null;
@@ -170,7 +139,7 @@ export function SgToolBar(props) {
170
139
  const raw = localStorage.getItem(storageKey);
171
140
  if (!raw)
172
141
  return null;
173
- const parsed = parseStoredDragPosition(raw);
142
+ const parsed = parseStoredPanelDragPosition(raw);
174
143
  if (!parsed) {
175
144
  localStorage.removeItem(storageKey);
176
145
  return null;
@@ -468,15 +437,10 @@ export function SgToolBar(props) {
468
437
  saveStoredPosition,
469
438
  setDragHoverZoneSafe
470
439
  ]);
471
- const showContent = !isCollapsed;
472
- const openUp = orientation === "vertical" && direction === "up";
473
- const openLeft = orientation === "horizontal" && direction === "left";
474
440
  const detachFromDockFlow = dragActive && inDock && !freeDrag;
475
441
  const normalizedButtonsPerDirection = Number.isFinite(buttonsPerDirection) && typeof buttonsPerDirection === "number" && buttonsPerDirection > 0
476
442
  ? Math.floor(buttonsPerDirection)
477
443
  : undefined;
478
- const showLeadingCollapseButton = orientation === "horizontal" && openLeft && showContent;
479
- const collapseIconDirection = resolvedOrientationDirection === "horizontal-right" ? "right" : direction;
480
444
  const content = showContent ? (_jsx("div", { className: cn("gap-2 p-2", normalizedButtonsPerDirection
481
445
  ? "grid"
482
446
  : orientation === "horizontal"
@@ -506,7 +470,7 @@ export function SgToolBar(props) {
506
470
  : ""
507
471
  : showContent
508
472
  ? (openUp ? "border-t border-border" : "border-b border-border")
509
- : ""), style: { backgroundColor: bgColorTitle }, children: [collapsible && showLeadingCollapseButton ? (_jsx("button", { type: "button", className: "inline-flex size-6 items-center justify-center rounded-md hover:bg-muted", onClick: () => setIsCollapsed(!isCollapsed), onPointerDown: (e) => e.stopPropagation(), "aria-label": "Toggle toolbar", children: _jsx(CollapseIcon, { direction: collapseIconDirection, collapsed: isCollapsed }) })) : null, title ? (_jsx("span", { className: "text-xs font-semibold text-foreground truncate", children: title })) : null, collapsible && !showLeadingCollapseButton ? (_jsx("button", { type: "button", className: "ml-auto inline-flex size-6 items-center justify-center rounded-md hover:bg-muted", onClick: () => setIsCollapsed(!isCollapsed), onPointerDown: (e) => e.stopPropagation(), "aria-label": "Toggle toolbar", children: _jsx(CollapseIcon, { direction: collapseIconDirection, collapsed: isCollapsed }) })) : null] })), openUp || openLeft ? null : content] }) }));
473
+ : ""), style: { backgroundColor: bgColorTitle }, children: [collapsible && showLeadingCollapseButton ? (_jsx("button", { type: "button", className: "inline-flex size-6 items-center justify-center rounded-md hover:bg-muted", onClick: () => setIsCollapsed(!isCollapsed), onPointerDown: (e) => e.stopPropagation(), "aria-label": t(i18n, "components.toolbar.toggle"), children: _jsx(CollapseIcon, { direction: collapseIconDirection, collapsed: isCollapsed }) })) : null, title ? (_jsx("span", { className: "text-xs font-semibold text-foreground truncate", children: title })) : null, collapsible && !showLeadingCollapseButton ? (_jsx("button", { type: "button", className: "ml-auto inline-flex size-6 items-center justify-center rounded-md hover:bg-muted", onClick: () => setIsCollapsed(!isCollapsed), onPointerDown: (e) => e.stopPropagation(), "aria-label": t(i18n, "components.toolbar.toggle"), children: _jsx(CollapseIcon, { direction: collapseIconDirection, collapsed: isCollapsed }) })) : null] })), openUp || openLeft ? null : content] }) }));
510
474
  const needsCenterWrapper = inDock && (effectiveZone === "right" || effectiveZone === "left");
511
475
  const toolbarForRender = needsCenterWrapper && !detachFromDockFlow ? (_jsx("div", { style: { width: "100%", display: "flex", justifyContent: "center", order: toolbarRenderOrder }, children: toolbar })) : toolbar;
512
476
  if (portalTarget) {
@@ -1 +1 @@
1
- {"version":3,"file":"SgTreeView.d.ts","sourceRoot":"","sources":["../../src/layout/SgTreeView.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SgTreeView.d.ts","sourceRoot":"","sources":["../../src/layout/SgTreeView.tsx"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ import * as React from "react";
4
4
  import { ChevronDown, ChevronUp, Search } from "lucide-react";
5
5
  import { SgInputText } from "../inputs/SgInputText";
6
6
  import { SgButton } from "../buttons/SgButton";
7
+ import { t, useComponentsI18n } from "../i18n";
7
8
  function cn(...parts) {
8
9
  return parts.filter(Boolean).join(" ");
9
10
  }
@@ -190,7 +191,10 @@ function toneClasses(tone) {
190
191
  };
191
192
  }
192
193
  export const SgTreeView = React.forwardRef(function SgTreeView(props, ref) {
193
- const { nodes, className, style, size = "md", density = "normal", tone = "default", iconTone = "default", checkable = false, checkMode = "live", confirmSelection = "leafOnly", searchable = false, searchPlaceholder = "Search...", expandMatchesOnSearch = true, branchLabelBehavior = "toggle", emptyText = "No items.", maxHeightClassName = "max-h-[60vh]" } = props;
194
+ const i18n = useComponentsI18n();
195
+ const { nodes, className, style, size = "md", density = "normal", tone = "default", iconTone = "default", checkable = false, checkMode = "live", confirmSelection = "leafOnly", searchable = false, searchPlaceholder: searchPlaceholderProp, expandMatchesOnSearch = true, branchLabelBehavior = "toggle", emptyText: emptyTextProp, maxHeightClassName = "max-h-[60vh]" } = props;
196
+ const searchPlaceholder = searchPlaceholderProp ?? `${t(i18n, "components.actions.search")}...`;
197
+ const emptyText = emptyTextProp ?? t(i18n, "components.tree.empty");
194
198
  const SZ = sizeMap[size];
195
199
  const DY = densityMap[density];
196
200
  const T = toneClasses(tone);
@@ -317,7 +321,7 @@ export const SgTreeView = React.forwardRef(function SgTreeView(props, ref) {
317
321
  const isOpen = expandedSet.has(node.id);
318
322
  const isDisabled = !!node.disabled;
319
323
  const checkedState = checkable ? computeCheckedState(node.id, maps.childrenById, checkedSet) : "unchecked";
320
- return (_jsxs("div", { children: [_jsxs("div", { className: cn("flex items-center rounded-md", DY.rowPx, DY.rowPy, DY.gap, T.rowHover, isDisabled && "opacity-60"), style: { paddingLeft: 8 + depth * DY.indent }, children: [_jsx("button", { type: "button", className: cn(DY.caret, "shrink-0 rounded-md flex items-center justify-center", "hover:bg-sg-hover2 hover:bg-foreground/10", "focus:outline-none focus:ring-2 focus:ring-sg-focus/30", !hasChildren && "opacity-0 pointer-events-none"), onClick: () => hasChildren && !isDisabled && toggleExpand(node), "aria-label": isOpen ? "Collapse" : "Expand", disabled: isDisabled, children: _jsx("span", { className: cn("transition-transform", isOpen && "rotate-90"), children: ">" }) }), checkable && (_jsx("input", { type: "checkbox", className: cn(SZ.checkbox, "rounded border border-sg-border bg-sg-surface", "focus:outline-none focus:ring-2 focus:ring-sg-focus/30"), disabled: isDisabled, checked: checkedState === "checked", ref: (el) => {
324
+ return (_jsxs("div", { children: [_jsxs("div", { className: cn("flex items-center rounded-md", DY.rowPx, DY.rowPy, DY.gap, T.rowHover, isDisabled && "opacity-60"), style: { paddingLeft: 8 + depth * DY.indent }, children: [_jsx("button", { type: "button", className: cn(DY.caret, "shrink-0 rounded-md flex items-center justify-center", "hover:bg-sg-hover2 hover:bg-foreground/10", "focus:outline-none focus:ring-2 focus:ring-sg-focus/30", !hasChildren && "opacity-0 pointer-events-none"), onClick: () => hasChildren && !isDisabled && toggleExpand(node), "aria-label": isOpen ? t(i18n, "components.actions.collapse") : t(i18n, "components.actions.expand"), disabled: isDisabled, children: _jsx("span", { className: cn("transition-transform", isOpen && "rotate-90"), children: ">" }) }), checkable && (_jsx("input", { type: "checkbox", className: cn(SZ.checkbox, "rounded border border-sg-border bg-sg-surface", "focus:outline-none focus:ring-2 focus:ring-sg-focus/30"), disabled: isDisabled, checked: checkedState === "checked", ref: (el) => {
321
325
  if (el)
322
326
  el.indeterminate = checkedState === "indeterminate";
323
327
  }, onChange: () => toggleCheck(node) })), node.icon && (_jsx("div", { className: cn("shrink-0", SZ.icon, iconTone === "primary" ? "text-[rgb(var(--sg-primary-600))]" : ""), children: node.icon })), _jsx("button", { type: "button", className: cn("flex-1 text-left rounded-md", SZ.text, isDisabled ? "cursor-not-allowed" : "cursor-pointer", "focus:outline-none focus:ring-2 focus:ring-sg-focus/30"), onClick: () => {
@@ -333,6 +337,6 @@ export const SgTreeView = React.forwardRef(function SgTreeView(props, ref) {
333
337
  }, disabled: isDisabled, children: node.label })] }), hasChildren && isOpen && _jsx("div", { children: node.children.map((c) => renderNode(c, depth + 1)) })] }, node.id));
334
338
  };
335
339
  const hasAny = filtered.length > 0;
336
- return (_jsxs("div", { className: cn("w-full", className), style: style, children: [_jsxs("div", { className: "mb-2 flex items-center gap-2", children: [searchable && (_jsx(SgInputText, { id: searchId, labelText: searchPlaceholder, placeholder: searchPlaceholder, prefixIcon: _jsx(Search, { size: 16 }), clearButton: true, filled: true, inputProps: { value: search }, onChange: (value) => setSearch(value) })), _jsx(SgButton, { severity: "secondary", appearance: "ghost", size: "sm", shape: "rounded", onClick: expandAll, leftIcon: _jsx(ChevronDown, { className: "size-4" }), children: "Expand all" }), _jsx(SgButton, { severity: "secondary", appearance: "ghost", size: "sm", shape: "rounded", onClick: collapseAll, leftIcon: _jsx(ChevronUp, { className: "size-4" }), children: "Collapse all" }), checkable && (_jsx(SgButton, { severity: "danger", appearance: "outline", size: "sm", shape: "rounded", onClick: clearChecked, title: "Clear selection", children: "Clear" }))] }), _jsxs("div", { className: cn("rounded-sg border border-sg-border", T.panelBg, "text-sg-text"), children: [_jsx("div", { className: cn("overflow-auto", maxHeightClassName), children: _jsx("div", { className: "p-2", children: !hasAny ? (_jsx("div", { className: cn("p-6 text-center", SZ.text, T.subtle), children: emptyText })) : (filtered.map((n) => renderNode(n, 0))) }) }), confirmEnabled && confirmCfg && (_jsx("div", { className: cn("border-t border-sg-border px-3 py-2", (confirmCfg.sticky ?? true) && "sticky bottom-0 bg-sg-surface/95 bg-background/95 backdrop-blur"), children: _jsxs("div", { className: "flex items-center justify-between gap-3", children: [_jsx("div", { className: cn("text-xs", T.subtle), children: confirmCfg.hint ?? (_jsxs(_Fragment, { children: ["Selected: ", _jsx("span", { className: "font-medium text-sg-text", children: confirmSelectedIds.length }), confirmSelection === "leafOnly" ? " (leafs)" : ""] })) }), _jsxs("div", { className: "flex items-center gap-2", children: [(confirmCfg.showCancel ?? false) && (_jsx("button", { type: "button", onClick: onCancel, className: cn("rounded-md border border-sg-border", T.panelBg, "text-sg-text hover:bg-sg-hover", "focus:outline-none focus:ring-2 focus:ring-sg-focus/30", SZ.btn), children: confirmCfg.cancelLabel ?? "Cancel" })), _jsx(SgButton, { severity: "secondary", appearance: "outline", size: "md", shape: "rounded", onClick: clearChecked, disabled: !!confirmDisabled, children: "Clear" }), _jsx(SgButton, { severity: "primary", appearance: "solid", elevation: "sm", size: "md", shape: "rounded", disabled: !!confirmDisabled, onClick: onConfirm, children: confirmCfg.label ?? "Confirm" })] })] }) }))] })] }));
340
+ return (_jsxs("div", { className: cn("w-full", className), style: style, children: [_jsxs("div", { className: "mb-2 flex items-center gap-2", children: [searchable && (_jsx(SgInputText, { id: searchId, labelText: searchPlaceholder, placeholder: searchPlaceholder, prefixIcon: _jsx(Search, { size: 16 }), clearButton: true, filled: true, inputProps: { value: search }, onChange: (value) => setSearch(value) })), _jsx(SgButton, { severity: "secondary", appearance: "ghost", size: "sm", shape: "rounded", onClick: expandAll, leftIcon: _jsx(ChevronDown, { className: "size-4" }), children: t(i18n, "components.actions.expandAll") }), _jsx(SgButton, { severity: "secondary", appearance: "ghost", size: "sm", shape: "rounded", onClick: collapseAll, leftIcon: _jsx(ChevronUp, { className: "size-4" }), children: t(i18n, "components.actions.collapseAll") }), checkable && (_jsx(SgButton, { severity: "danger", appearance: "outline", size: "sm", shape: "rounded", onClick: clearChecked, title: t(i18n, "components.actions.clearSelection"), children: t(i18n, "components.actions.clear") }))] }), _jsxs("div", { className: cn("rounded-sg border border-sg-border", T.panelBg, "text-sg-text"), children: [_jsx("div", { className: cn("overflow-auto", maxHeightClassName), children: _jsx("div", { className: "p-2", children: !hasAny ? (_jsx("div", { className: cn("p-6 text-center", SZ.text, T.subtle), children: emptyText })) : (filtered.map((n) => renderNode(n, 0))) }) }), confirmEnabled && confirmCfg && (_jsx("div", { className: cn("border-t border-sg-border px-3 py-2", (confirmCfg.sticky ?? true) && "sticky bottom-0 bg-sg-surface/95 bg-background/95 backdrop-blur"), children: _jsxs("div", { className: "flex items-center justify-between gap-3", children: [_jsx("div", { className: cn("text-xs", T.subtle), children: confirmCfg.hint ?? (_jsxs(_Fragment, { children: [t(i18n, "components.tree.selected", { count: confirmSelectedIds.length }), confirmSelection === "leafOnly" ? t(i18n, "components.tree.selectedLeafs") : ""] })) }), _jsxs("div", { className: "flex items-center gap-2", children: [(confirmCfg.showCancel ?? false) && (_jsx("button", { type: "button", onClick: onCancel, className: cn("rounded-md border border-sg-border", T.panelBg, "text-sg-text hover:bg-sg-hover", "focus:outline-none focus:ring-2 focus:ring-sg-focus/30", SZ.btn), children: confirmCfg.cancelLabel ?? t(i18n, "components.actions.cancel") })), _jsx(SgButton, { severity: "secondary", appearance: "outline", size: "md", shape: "rounded", onClick: clearChecked, disabled: !!confirmDisabled, children: t(i18n, "components.actions.clear") }), _jsx(SgButton, { severity: "primary", appearance: "solid", elevation: "sm", size: "md", shape: "rounded", disabled: !!confirmDisabled, onClick: onConfirm, children: confirmCfg.label ?? t(i18n, "components.actions.confirm") })] })] }) }))] })] }));
337
341
  });
338
342
  SgTreeView.displayName = "SgTreeView";
@@ -0,0 +1,7 @@
1
+ export declare function parseStoredPanelDragPosition(raw: unknown): {
2
+ x: number;
3
+ y: number;
4
+ } | null;
5
+ export declare function buildToolbarStorageKey(id: string): string;
6
+ export declare function buildDockMenuStorageKey(dragId?: string | null, isAbsolutePosition?: boolean): string | null;
7
+ //# sourceMappingURL=drag-position.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drag-position.d.ts","sourceRoot":"","sources":["../../src/layout/drag-position.ts"],"names":[],"mappings":"AAAA,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,OAAO,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAwB1F;AAED,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,uBAAuB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,kBAAkB,UAAQ,GAAG,MAAM,GAAG,IAAI,CAGzG"}
@@ -0,0 +1,30 @@
1
+ export function parseStoredPanelDragPosition(raw) {
2
+ const value = typeof raw === "string" ? (() => {
3
+ try {
4
+ return JSON.parse(raw);
5
+ }
6
+ catch {
7
+ return null;
8
+ }
9
+ })() : raw;
10
+ if (!value ||
11
+ typeof value !== "object" ||
12
+ typeof value.x !== "number" ||
13
+ typeof value.y !== "number" ||
14
+ !Number.isFinite(value.x) ||
15
+ !Number.isFinite(value.y)) {
16
+ return null;
17
+ }
18
+ return {
19
+ x: value.x,
20
+ y: value.y
21
+ };
22
+ }
23
+ export function buildToolbarStorageKey(id) {
24
+ return `sg-toolbar-pos:${id}`;
25
+ }
26
+ export function buildDockMenuStorageKey(dragId, isAbsolutePosition = false) {
27
+ if (!dragId)
28
+ return null;
29
+ return `sg-dockmenu-pos:${dragId}:${isAbsolutePosition ? "parent" : "viewport"}`;
30
+ }
@@ -0,0 +1,187 @@
1
+ export type MenuLogicNode = {
2
+ id: string;
3
+ label?: string;
4
+ children?: MenuLogicNode[];
5
+ url?: string;
6
+ onClick?: (() => void) | undefined;
7
+ };
8
+ export type MenuVisibleNode<T extends MenuLogicNode = MenuLogicNode> = {
9
+ node: T;
10
+ depth: number;
11
+ parentId?: string;
12
+ };
13
+ export type MenuSearchEntry = {
14
+ id: string;
15
+ label: string;
16
+ path: string;
17
+ group: string;
18
+ };
19
+ export type MenuMaps<T extends MenuLogicNode = MenuLogicNode> = {
20
+ parentById: Map<string, string>;
21
+ nodeById: Map<string, T>;
22
+ childrenByParent: Map<string, string[]>;
23
+ firstByUrl: Map<string, string>;
24
+ };
25
+ export type MenuActiveSets = {
26
+ exact: Set<string>;
27
+ branch: Set<string>;
28
+ };
29
+ export type MenuKeyboardAction = {
30
+ type: "focus";
31
+ id: string;
32
+ } | {
33
+ type: "toggle";
34
+ id: string;
35
+ } | {
36
+ type: "activate";
37
+ id: string;
38
+ } | {
39
+ type: "noop";
40
+ };
41
+ export declare function buildMenuMaps<T extends MenuLogicNode>(menu: T[], rootParentId?: string): MenuMaps<T>;
42
+ export declare function collectParentChain(parentById: Map<string, string>, id: string, rootParentId?: string): string[];
43
+ export declare function computeActiveSets<T extends MenuLogicNode>(nodes: T[], activeId: string | undefined, activeUrl: string | undefined): MenuActiveSets;
44
+ export declare function resolveEffectiveActiveId(args: {
45
+ activeId?: string;
46
+ activeUrl?: string;
47
+ localActiveId?: string;
48
+ firstByUrl: Map<string, string>;
49
+ }): string | undefined;
50
+ export declare function mergeExpandedIdsForActivePath(currentIds: string[], parentChain: string[]): string[];
51
+ export declare function resolveTieredActiveState<T extends MenuLogicNode>(args: {
52
+ effectiveActiveId?: string;
53
+ maps: MenuMaps<T>;
54
+ menu: T[];
55
+ rootParentId?: string;
56
+ }): {
57
+ tieredPath: string[];
58
+ megaActiveId?: string;
59
+ };
60
+ export declare function resolveMenuLayoutState(args: {
61
+ dockMode: boolean;
62
+ effectiveDockZone: string | null;
63
+ orientationDirection?: "horizontal-left" | "horizontal-right" | "vertical-up" | "vertical-top" | "vertical-down";
64
+ position: "left" | "right";
65
+ horizontalDockAlign: "left" | "right" | null;
66
+ isCollapsed: boolean;
67
+ menuStyle: "sidebar" | "drawer" | "inline" | "hybrid";
68
+ effectiveMenuStyle: "panel" | "tiered" | "mega-horizontal" | "mega-vertical";
69
+ pinnedState: boolean;
70
+ expandedWidthCss: string;
71
+ collapsedWidthCss: string;
72
+ }): {
73
+ resolvedPosition: "left" | "right";
74
+ isHorizontalDockZone: boolean;
75
+ isVerticalDockZone: boolean;
76
+ tieredOpenToLeft: boolean;
77
+ isMegaMenuStyle: boolean;
78
+ dockAlign: "start" | "end" | null;
79
+ sidebarWidthCss: string;
80
+ };
81
+ export type MenuHintPlacement = "top" | "right";
82
+ export declare function resolveMenuNodeActionIntent(args: {
83
+ variant: "panel" | "flat";
84
+ hasChildren: boolean;
85
+ hasActionTarget: boolean;
86
+ isCollapsed?: boolean;
87
+ }): "toggle" | "activate" | "noop";
88
+ export declare function resolveExpandedIdsToggle(args: {
89
+ currentIds: string[];
90
+ nodeId: string;
91
+ mode: "accordion" | "multiple";
92
+ parentById: Map<string, string>;
93
+ childrenByParent: Map<string, string[]>;
94
+ rootParentId?: string;
95
+ }): string[];
96
+ export declare function resolveMenuHintPosition(args: {
97
+ isConnected: boolean;
98
+ rect: {
99
+ left: number;
100
+ right: number;
101
+ top: number;
102
+ width: number;
103
+ height: number;
104
+ };
105
+ placement: MenuHintPlacement;
106
+ }): {
107
+ x: number;
108
+ y: number;
109
+ } | null;
110
+ export declare function resolveHorizontalDockAlign(clientX: number, zoneRect: {
111
+ left: number;
112
+ width: number;
113
+ }): "left" | "right";
114
+ export declare function resolveTieredHoverPath(currentPath: string[], depth: number, nodeId: string, hasChildren: boolean): string[];
115
+ export declare function resolveTieredHoverIntent(args: {
116
+ currentPath: string[];
117
+ depth: number;
118
+ nodeId: string;
119
+ hasChildren: boolean;
120
+ openSubmenuOnHover: boolean;
121
+ }): string[] | undefined;
122
+ export declare function resolveTieredClickState(currentPath: string[], depth: number, nodeId: string): {
123
+ nextPath: string[];
124
+ isOpenAtDepth: boolean;
125
+ };
126
+ export declare function resolveMenuSearchSelectionState(args: {
127
+ currentExpandedIds: string[];
128
+ parentChain: string[];
129
+ rootToParent: string[];
130
+ nodeId: string;
131
+ hasChildren: boolean;
132
+ hasActionTarget: boolean;
133
+ }): {
134
+ expandedIds: string[];
135
+ tieredPath: string[];
136
+ megaActiveId?: string;
137
+ localActiveId?: string;
138
+ shouldActivateNode: boolean;
139
+ };
140
+ export declare function resolveTieredNodeClickIntent(args: {
141
+ currentPath: string[];
142
+ depth: number;
143
+ nodeId: string;
144
+ hasChildren: boolean;
145
+ hasActionTarget: boolean;
146
+ }): {
147
+ nextPath: string[];
148
+ shouldActivateNode: boolean;
149
+ isOpenAtDepth: boolean;
150
+ };
151
+ export declare function resolveMegaMenuActiveNode<T extends MenuLogicNode>(items: T[], megaActiveId?: string): T | undefined;
152
+ export declare function resolveMegaMenuInteraction(args: {
153
+ nodeId: string;
154
+ hasChildren: boolean;
155
+ }): {
156
+ nextMegaActiveId?: string;
157
+ shouldActivateNode: boolean;
158
+ };
159
+ export declare function resolveMegaMenuHoverActiveId(args: {
160
+ nodeId: string;
161
+ hasChildren: boolean;
162
+ }): string | undefined;
163
+ export type MenuAutocompleteItem = {
164
+ id: string;
165
+ label: string;
166
+ value: string;
167
+ group: string;
168
+ data: {
169
+ nodeId: string;
170
+ path: string;
171
+ };
172
+ };
173
+ export declare function resolveMenuAutocompleteItems(searchEntries: MenuSearchEntry[], query: string, limit?: number): MenuAutocompleteItem[];
174
+ export declare function filterMenuNodes<T extends MenuLogicNode>(nodes: T[], query: string): T[];
175
+ export declare function collectMenuSearchEntries<T extends MenuLogicNode>(nodes: T[], trail?: string[], out?: MenuSearchEntry[]): MenuSearchEntry[];
176
+ export declare function flattenVisibleNodes<T extends MenuLogicNode>(nodes: T[], expandedSet: Set<string>, collapsed: boolean, forceExpand: boolean, depth?: number, parentId?: string, out?: MenuVisibleNode<T>[]): MenuVisibleNode<T>[];
177
+ export declare function resolveMenuKeyboardAction(args: {
178
+ key: string;
179
+ visibleNodes: MenuVisibleNode[];
180
+ focusedId?: string;
181
+ expandedIds: Set<string>;
182
+ hasSearch: boolean;
183
+ isCollapsed: boolean;
184
+ parentById: Map<string, string>;
185
+ rootParentId: string;
186
+ }): MenuKeyboardAction;
187
+ //# sourceMappingURL=menu-logic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu-logic.d.ts","sourceRoot":"","sources":["../../src/layout/menu-logic.ts"],"names":[],"mappings":"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"}