@logicplanes/kaeso-ui 0.3.7 → 0.3.9

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 (138) hide show
  1. package/ai/component-guides.md +5 -4
  2. package/ai/component-registry.json +15 -8
  3. package/ai/component-registry.md +9 -8
  4. package/ai/icons.md +1 -1
  5. package/ai/tokens.md +1 -1
  6. package/dist/blocks/delete-resource.js +1 -1
  7. package/dist/blocks/pages.js +2 -2
  8. package/dist/blocks/resource-list.js +2 -2
  9. package/dist/chunks/{app-frame-B9vrgwaE.js → app-frame-Cj_gCbmu.js} +6 -6
  10. package/dist/chunks/{app-frame-B9vrgwaE.js.map → app-frame-Cj_gCbmu.js.map} +1 -1
  11. package/dist/chunks/{banner-BBlNFHd-.js → banner-DY1jSc9Y.js} +2 -2
  12. package/dist/chunks/{banner-BBlNFHd-.js.map → banner-DY1jSc9Y.js.map} +1 -1
  13. package/dist/chunks/{button-CAPyW-v8.js → button-h2IFCER2.js} +2 -2
  14. package/dist/chunks/{button-CAPyW-v8.js.map → button-h2IFCER2.js.map} +1 -1
  15. package/dist/chunks/{calendar-CBeptQFq.js → calendar-cVuezHQ6.js} +5 -2
  16. package/dist/chunks/calendar-cVuezHQ6.js.map +1 -0
  17. package/dist/chunks/{code-block-DREsvJ-g.js → code-block-BU8gYeZQ.js} +2 -2
  18. package/dist/chunks/{code-block-DREsvJ-g.js.map → code-block-BU8gYeZQ.js.map} +1 -1
  19. package/dist/chunks/{combobox-DqtzsAKG.js → combobox-B9ttar4C.js} +3 -3
  20. package/dist/chunks/{combobox-DqtzsAKG.js.map → combobox-B9ttar4C.js.map} +1 -1
  21. package/dist/chunks/{command-list-D5k0uvkR.js → command-list-DZMVrXWD.js} +2 -2
  22. package/dist/chunks/{command-list-D5k0uvkR.js.map → command-list-DZMVrXWD.js.map} +1 -1
  23. package/dist/chunks/{copy-button-CNpEnS04.js → copy-button-CXJ7fA9z.js} +3 -3
  24. package/dist/chunks/{copy-button-CNpEnS04.js.map → copy-button-CXJ7fA9z.js.map} +1 -1
  25. package/dist/chunks/{core-CqLWVMDI.js → core-Bu6iq5uh.js} +2 -2
  26. package/dist/chunks/{core-CqLWVMDI.js.map → core-Bu6iq5uh.js.map} +1 -1
  27. package/dist/chunks/{date-popup-BgDz6SUj.js → date-popup-BJPA_fBm.js} +3 -3
  28. package/dist/chunks/{date-popup-BgDz6SUj.js.map → date-popup-BJPA_fBm.js.map} +1 -1
  29. package/dist/chunks/{de-CkXZKaBD.js → de-BnNQtBSV.js} +3 -3
  30. package/dist/chunks/{de-CkXZKaBD.js.map → de-BnNQtBSV.js.map} +1 -1
  31. package/dist/chunks/{dialog-B2RzuBu6.js → dialog-BLcP7v24.js} +4 -4
  32. package/dist/chunks/{dialog-B2RzuBu6.js.map → dialog-BLcP7v24.js.map} +1 -1
  33. package/dist/chunks/hidden-description-B2zSmLcn.js +23 -0
  34. package/dist/chunks/hidden-description-B2zSmLcn.js.map +1 -0
  35. package/dist/chunks/{icon-button-D4O4puwH.js → icon-button-DmKFxQbP.js} +3 -3
  36. package/dist/chunks/{icon-button-D4O4puwH.js.map → icon-button-DmKFxQbP.js.map} +1 -1
  37. package/dist/chunks/{identity-CsZvAUwu.js → identity-Chj7fW89.js} +3 -3
  38. package/dist/chunks/{identity-CsZvAUwu.js.map → identity-Chj7fW89.js.map} +1 -1
  39. package/dist/chunks/{input-B0wtkcNh.js → input-9y3afoiq.js} +2 -2
  40. package/dist/chunks/{input-B0wtkcNh.js.map → input-9y3afoiq.js.map} +1 -1
  41. package/dist/chunks/{input-group-BQLw06B0.js → input-group-BoxjnN8I.js} +2 -2
  42. package/dist/chunks/{input-group-BQLw06B0.js.map → input-group-BoxjnN8I.js.map} +1 -1
  43. package/dist/chunks/{iso-field-BUXgY1dB.js → iso-field-DAa6iPWn.js} +2 -2
  44. package/dist/chunks/{iso-field-BUXgY1dB.js.map → iso-field-DAa6iPWn.js.map} +1 -1
  45. package/dist/chunks/{list-wXZIZo_s.js → list-7VARol_x.js} +4 -4
  46. package/dist/chunks/{list-wXZIZo_s.js.map → list-7VARol_x.js.map} +1 -1
  47. package/dist/chunks/{markdown-DWyxjsSY.js → markdown-DBVNULWg.js} +4 -4
  48. package/dist/chunks/{markdown-DWyxjsSY.js.map → markdown-DBVNULWg.js.map} +1 -1
  49. package/dist/chunks/{nav-sheet-QqNRHo-y.js → nav-sheet-D7wIF_OU.js} +2 -2
  50. package/dist/chunks/{nav-sheet-QqNRHo-y.js.map → nav-sheet-D7wIF_OU.js.map} +1 -1
  51. package/dist/chunks/{page-header-Ccnrspbp.js → page-header-B3tV8Wog.js} +2 -2
  52. package/dist/chunks/{page-header-Ccnrspbp.js.map → page-header-B3tV8Wog.js.map} +1 -1
  53. package/dist/chunks/{pagination-CEmWZNjp.js → pagination-CLfsofo3.js} +3 -3
  54. package/dist/chunks/{pagination-CEmWZNjp.js.map → pagination-CLfsofo3.js.map} +1 -1
  55. package/dist/chunks/picker-popover-B5YdOxNm.js +105 -0
  56. package/dist/chunks/picker-popover-B5YdOxNm.js.map +1 -0
  57. package/dist/chunks/{range-popup-CG9Jo5B7.js → range-popup-ZunS8QSH.js} +4 -4
  58. package/dist/chunks/{range-popup-CG9Jo5B7.js.map → range-popup-ZunS8QSH.js.map} +1 -1
  59. package/dist/chunks/{rights-hMoaFasn.js → rights-CiIBzT9o.js} +4 -4
  60. package/dist/chunks/{rights-hMoaFasn.js.map → rights-CiIBzT9o.js.map} +1 -1
  61. package/dist/chunks/{segmented-DXKVF-nY.js → segmented-DxjnIuww.js} +3 -3
  62. package/dist/chunks/{segmented-DXKVF-nY.js.map → segmented-DxjnIuww.js.map} +1 -1
  63. package/dist/chunks/{sidebar-Dey1ZfGt.js → sidebar-ZSTPK9Jn.js} +210 -206
  64. package/dist/chunks/sidebar-ZSTPK9Jn.js.map +1 -0
  65. package/dist/chunks/{switch-CSKMEomo.js → switch-Cq1OfeBr.js} +2 -2
  66. package/dist/chunks/{switch-CSKMEomo.js.map → switch-Cq1OfeBr.js.map} +1 -1
  67. package/dist/chunks/{tag-CwDKXVHj.js → tag-XgPXKoxi.js} +2 -2
  68. package/dist/chunks/{tag-CwDKXVHj.js.map → tag-XgPXKoxi.js.map} +1 -1
  69. package/dist/chunks/{text-Dvvgg5Jt.js → text-IoDy3Vxi.js} +2 -2
  70. package/dist/chunks/{text-Dvvgg5Jt.js.map → text-IoDy3Vxi.js.map} +1 -1
  71. package/dist/chunks/{textarea-2d373OyU.js → textarea-jOiTkfMf.js} +3 -3
  72. package/dist/chunks/{textarea-2d373OyU.js.map → textarea-jOiTkfMf.js.map} +1 -1
  73. package/dist/chunks/{timeseries-LRDAZHV0.js → timeseries-BBWsSM4Q.js} +51 -51
  74. package/dist/chunks/timeseries-BBWsSM4Q.js.map +1 -0
  75. package/dist/chunks/{tooltip-S1DmyLVl.js → tooltip-CTBnfiDH.js} +30 -30
  76. package/dist/chunks/tooltip-CTBnfiDH.js.map +1 -0
  77. package/dist/chunks/{tooltip-root-vjylFUqw.js → tooltip-root-B0zWodAJ.js} +2 -2
  78. package/dist/chunks/{tooltip-root-vjylFUqw.js.map → tooltip-root-B0zWodAJ.js.map} +1 -1
  79. package/dist/chunks/{zh-CN-CqEA4PCM.js → zh-CN-CKffAT7j.js} +3 -3
  80. package/dist/chunks/{zh-CN-CqEA4PCM.js.map → zh-CN-CKffAT7j.js.map} +1 -1
  81. package/dist/components/app-frame.js +2 -2
  82. package/dist/components/banner.js +1 -1
  83. package/dist/components/button-group.js +2 -2
  84. package/dist/components/button.js +1 -1
  85. package/dist/components/calendar.js +1 -1
  86. package/dist/components/charts/bar.js +1 -1
  87. package/dist/components/charts/donut.js +1 -1
  88. package/dist/components/charts/gauge.js +1 -1
  89. package/dist/components/charts/sankey.js +1 -1
  90. package/dist/components/charts/timeseries.js +1 -1
  91. package/dist/components/charts.js +2 -2
  92. package/dist/components/code-block.js +1 -1
  93. package/dist/components/combobox.js +1 -1
  94. package/dist/components/command-list.js +2 -2
  95. package/dist/components/command-palette.js +1 -1
  96. package/dist/components/copy-button.js +1 -1
  97. package/dist/components/data-table.js +4 -4
  98. package/dist/components/date-picker.js +112 -110
  99. package/dist/components/date-picker.js.map +1 -1
  100. package/dist/components/dialog.js +2 -2
  101. package/dist/components/display-options.js +4 -4
  102. package/dist/components/filter-chip.js +2 -2
  103. package/dist/components/icon-button.js +1 -1
  104. package/dist/components/input.js +5 -5
  105. package/dist/components/kaeso/conversation.js +2 -2
  106. package/dist/components/kaeso/identity.js +1 -1
  107. package/dist/components/kaeso/moments.js +3 -3
  108. package/dist/components/kaeso/rights.js +1 -1
  109. package/dist/components/kaeso/usage.js +1 -1
  110. package/dist/components/kaeso.js +5 -5
  111. package/dist/components/key-value.js +2 -2
  112. package/dist/components/list.js +1 -1
  113. package/dist/components/markdown.js +1 -1
  114. package/dist/components/page-header.js +1 -1
  115. package/dist/components/pagination.js +1 -1
  116. package/dist/components/playground.js +10 -10
  117. package/dist/components/segmented.js +1 -1
  118. package/dist/components/sheet.js +1 -1
  119. package/dist/components/sidebar.js +1 -1
  120. package/dist/components/switch.js +1 -1
  121. package/dist/components/tag.js +1 -1
  122. package/dist/components/text.js +1 -1
  123. package/dist/components/theme-menu.js +1 -1
  124. package/dist/components/tooltip.js +1 -1
  125. package/dist/i18n-provider.js +1 -1
  126. package/dist/index.js +28 -28
  127. package/dist/kaeso.css +2 -4
  128. package/dist/styles.css +1 -1
  129. package/dist/types/components/command-list/docs.d.ts +1 -0
  130. package/dist/types/components/command-list/picker-popover.d.ts +1 -0
  131. package/dist/types/utils/hidden-description.d.ts +9 -0
  132. package/package.json +13 -13
  133. package/dist/chunks/calendar-CBeptQFq.js.map +0 -1
  134. package/dist/chunks/picker-popover-C4ElNk7t.js +0 -102
  135. package/dist/chunks/picker-popover-C4ElNk7t.js.map +0 -1
  136. package/dist/chunks/sidebar-Dey1ZfGt.js.map +0 -1
  137. package/dist/chunks/timeseries-LRDAZHV0.js.map +0 -1
  138. package/dist/chunks/tooltip-S1DmyLVl.js.map +0 -1
@@ -0,0 +1,105 @@
1
+ "use client";
2
+ import { t as e } from "./cn-DUDmdLpZ.js";
3
+ import { n as t, r as n } from "./portal-context-BBbzDKmY.js";
4
+ import { i as r } from "./context-BELWW79w.js";
5
+ import { t as i } from "./icon-BqujXDUc.js";
6
+ import { t as a } from "./icon-button-DmKFxQbP.js";
7
+ import { n as o } from "./select-Bbv2f5F8.js";
8
+ import { n as s, r as c, t as l } from "./hidden-description-B2zSmLcn.js";
9
+ import { n as u } from "./command-list-DZMVrXWD.js";
10
+ import { forwardRef as d, useSyncExternalStore as f } from "react";
11
+ import { Fragment as p, jsx as m, jsxs as h } from "react/jsx-runtime";
12
+ import { ArrowDown01Icon as g, Cancel01Icon as _ } from "@hugeicons/core-free-icons";
13
+ import { Popover as v } from "@base-ui/react/popover";
14
+ import { Dialog as y } from "@base-ui/react/dialog";
15
+ //#region src/components/command-list/picker-popover.tsx
16
+ var b = { width: {
17
+ sm: { classes: "w-320" },
18
+ md: { classes: "w-400" },
19
+ lg: { classes: "w-560" }
20
+ } }, x = { width: "md" }, S = "(max-width: 767px)", C = (e) => {
21
+ if (typeof window > "u" || !window.matchMedia) return () => {};
22
+ let t = window.matchMedia(S);
23
+ return t.addEventListener("change", e), () => t.removeEventListener("change", e);
24
+ }, w = () => typeof window < "u" && !!window.matchMedia?.(S).matches;
25
+ function T({ trigger: i, title: o, open: s, onOpenChange: c, width: l = "md", align: d = "start", children: p }) {
26
+ let g = r(), x = n(), S = f(C, w, () => !1), T = c ? { onOpenChange: (e) => c(e) } : {}, E = s === void 0 ? {} : { open: s };
27
+ return S ? /* @__PURE__ */ h(y.Root, {
28
+ ...E,
29
+ ...T,
30
+ children: [/* @__PURE__ */ m(y.Trigger, { render: i }), /* @__PURE__ */ h(y.Portal, {
31
+ container: x,
32
+ children: [/* @__PURE__ */ m(y.Backdrop, { className: "fixed inset-0 z-50 bg-overlay opacity-50 backdrop-motion" }), /* @__PURE__ */ h(y.Popup, {
33
+ "data-side": "bottom",
34
+ className: "fixed inset-8 z-50 flex flex-col overflow-hidden rounded-sheet bg-raised text-fg shadow-dialog outline-none sheet-motion",
35
+ children: [/* @__PURE__ */ h("div", {
36
+ className: "flex h-56 shrink-0 items-center gap-12 pr-8 pl-20 hairline-b",
37
+ children: [/* @__PURE__ */ m(y.Title, {
38
+ className: "min-w-0 flex-1 truncate text-body-lg font-semibold text-fg",
39
+ children: o
40
+ }), /* @__PURE__ */ m(y.Close, { render: /* @__PURE__ */ m(a, {
41
+ icon: _,
42
+ "aria-label": g("pickerPopover.close", "Close"),
43
+ tooltip: !1
44
+ }) })]
45
+ }), /* @__PURE__ */ m(u.Provider, {
46
+ value: "fill",
47
+ children: p
48
+ })]
49
+ })]
50
+ })]
51
+ }) : /* @__PURE__ */ h(v.Root, {
52
+ ...E,
53
+ ...T,
54
+ modal: !1,
55
+ children: [/* @__PURE__ */ m(v.Trigger, { render: i }), /* @__PURE__ */ m(v.Portal, {
56
+ container: x,
57
+ children: /* @__PURE__ */ m(v.Positioner, {
58
+ positionMethod: "fixed",
59
+ collisionBoundary: t(),
60
+ side: "bottom",
61
+ align: d,
62
+ sideOffset: 6,
63
+ collisionPadding: 8,
64
+ className: "z-50 outline-none",
65
+ children: /* @__PURE__ */ m(v.Popup, {
66
+ "aria-label": o,
67
+ className: e("flex max-w-full-bleed-4 flex-col overflow-hidden rounded-popover bg-raised text-fg shadow-raised outline-none popup-motion", b.width[l].classes),
68
+ children: /* @__PURE__ */ m(u.Provider, {
69
+ value: "popover",
70
+ children: p
71
+ })
72
+ })
73
+ })
74
+ })]
75
+ });
76
+ }
77
+ process.env.NODE_ENV !== "production" && (T.displayName = "PickerPopover");
78
+ var E = /* @__PURE__ */ d(function({ appearance: t = "default", size: n = "md", fullWidth: r, invalid: a, placeholder: u, children: d, className: f, type: _ = "button", "aria-label": v, "aria-describedby": y, ...b }, x) {
79
+ let S = d == null || d === !1, C = s(S ? u : d), w = c(C ? v : void 0), T = l(w.id, y);
80
+ return /* @__PURE__ */ h(p, { children: [/* @__PURE__ */ h("button", {
81
+ ref: x,
82
+ type: _,
83
+ "data-picker": "",
84
+ ...b,
85
+ ...!C && v ? { "aria-label": v } : {},
86
+ ...T ? { "aria-describedby": T } : {},
87
+ ...a ? { "aria-invalid": !0 } : {},
88
+ className: e("inline-flex min-w-0 cursor-pointer items-center justify-between rounded-pill font-medium whitespace-nowrap transition-control focus-ring disabled:cursor-not-allowed", o.size[n].classes, o.appearance[t].classes, a && "ring-invalid", r && "w-full", f),
89
+ children: [/* @__PURE__ */ m("span", {
90
+ className: e("flex min-w-0 flex-1 items-center truncate text-left", S && "font-regular text-fg-tertiary"),
91
+ children: S ? u : d
92
+ }), /* @__PURE__ */ m("span", {
93
+ className: "flex shrink-0 text-fg-tertiary",
94
+ children: /* @__PURE__ */ m(i, {
95
+ icon: g,
96
+ size: "sm"
97
+ })
98
+ })]
99
+ }), w.node] });
100
+ });
101
+ process.env.NODE_ENV !== "production" && (E.displayName = "PickerTrigger");
102
+ //#endregion
103
+ export { E as i, b as n, T as r, x as t };
104
+
105
+ //# sourceMappingURL=picker-popover-B5YdOxNm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"picker-popover-B5YdOxNm.js","names":["BaseDialog","__icon_Cancel01Icon","BasePopover","_Fragment","__icon_ArrowDown01Icon","cn","pageBoundary","usePortalContainer","useUiText","Icon","IconButton","KAESO_SELECT_VARIANTS","showsText","useHiddenDescription","joinIds","CommandListHeightContext","Fragment$1","KAESO_PICKER_POPOVER_VARIANTS","KAESO_PICKER_POPOVER_DEFAULT_VARIANTS","NARROW","subscribeNarrow","q","onChange","isNarrow","PickerPopover","t","container","narrow","useSyncExternalStore","change","onOpenChange","o","state","open","Dialog","trigger","title","Cancel01Icon","Popover","width","PickerTrigger","ariaLabel","describedBy","props","empty","children","shows","placeholder","purpose","descriptions","invalid","size","appearance","fullWidth","className","ArrowDown01Icon"],"sources":["../../src/components/command-list/picker-popover.tsx"],"sourcesContent":["import { forwardRef, useSyncExternalStore, type ButtonHTMLAttributes, type ReactElement, type ReactNode } from \"react\";\nimport { Popover as BasePopover } from \"@base-ui/react/popover\";\nimport { Dialog as BaseDialog } from \"@base-ui/react/dialog\";\nimport { cn } from \"../../utils/cn.js\";\nimport { pageBoundary, usePortalContainer } from \"../../utils/portal-context.js\";\nimport { Cancel01Icon as __icon_Cancel01Icon, ArrowDown01Icon as __icon_ArrowDown01Icon } from \"@hugeicons/core-free-icons\";\nimport { Icon } from \"../icon/icon.js\";\nimport { IconButton } from \"../icon-button/icon-button.js\";\nimport { KAESO_SELECT_VARIANTS } from \"../select/select.js\";\nimport { useUiText } from \"../../i18n/context.js\";\nimport { joinIds, showsText, useHiddenDescription } from \"../../utils/hidden-description.js\";\nimport { CommandListHeightContext } from \"./command-list.js\";\n\nexport const KAESO_PICKER_POPOVER_VARIANTS = {\n width: {\n sm: { classes: \"w-320\" },\n md: { classes: \"w-400\" },\n lg: { classes: \"w-560\" },\n },\n} as const;\nexport const KAESO_PICKER_POPOVER_DEFAULT_VARIANTS = { width: \"md\" } as const;\n\nconst NARROW = \"(max-width: 767px)\";\nconst subscribeNarrow = (onChange: () => void) => {\n if (typeof window === \"undefined\" || !window.matchMedia) return () => {};\n const q = window.matchMedia(NARROW);\n q.addEventListener(\"change\", onChange);\n return () => q.removeEventListener(\"change\", onChange);\n};\nconst isNarrow = () => typeof window !== \"undefined\" && !!window.matchMedia?.(NARROW).matches;\n\nexport interface PickerPopoverProps {\n trigger: ReactElement;\n title: string;\n open?: boolean | undefined;\n onOpenChange?: ((open: boolean) => void) | undefined;\n width?: keyof typeof KAESO_PICKER_POPOVER_VARIANTS.width | undefined;\n align?: \"start\" | \"end\" | undefined;\n children: ReactNode;\n}\n\nexport function PickerPopover({ trigger, title, open, onOpenChange, width = \"md\", align = \"start\", children }: PickerPopoverProps) {\n const t = useUiText();\n const container = usePortalContainer();\n const narrow = useSyncExternalStore(subscribeNarrow, isNarrow, () => false);\n const change = onOpenChange ? { onOpenChange: (o: boolean) => onOpenChange(o) } : {};\n const state = open !== undefined ? { open } : {};\n if (narrow)\n return (\n <BaseDialog.Root {...state} {...change}>\n <BaseDialog.Trigger render={trigger} />\n <BaseDialog.Portal container={container}>\n <BaseDialog.Backdrop className=\"fixed inset-0 z-50 bg-overlay opacity-50 backdrop-motion\" />\n <BaseDialog.Popup\n data-side=\"bottom\"\n className=\"fixed inset-8 z-50 flex flex-col overflow-hidden rounded-sheet bg-raised text-fg shadow-dialog outline-none sheet-motion\"\n >\n <div className=\"flex h-56 shrink-0 items-center gap-12 pr-8 pl-20 hairline-b\">\n <BaseDialog.Title className=\"min-w-0 flex-1 truncate text-body-lg font-semibold text-fg\">{title}</BaseDialog.Title>\n <BaseDialog.Close render={<IconButton icon={__icon_Cancel01Icon} aria-label={t(\"pickerPopover.close\", \"Close\")} tooltip={false} />} />\n </div>\n <CommandListHeightContext.Provider value=\"fill\">{children}</CommandListHeightContext.Provider>\n </BaseDialog.Popup>\n </BaseDialog.Portal>\n </BaseDialog.Root>\n );\n return (\n <BasePopover.Root {...state} {...change} modal={false}>\n <BasePopover.Trigger render={trigger} />\n <BasePopover.Portal container={container}>\n <BasePopover.Positioner\n positionMethod=\"fixed\"\n collisionBoundary={pageBoundary()}\n side=\"bottom\"\n align={align}\n sideOffset={6}\n collisionPadding={8}\n className=\"z-50 outline-none\"\n >\n <BasePopover.Popup\n aria-label={title}\n className={cn(\n \"flex max-w-full-bleed-4 flex-col overflow-hidden rounded-popover bg-raised text-fg shadow-raised outline-none popup-motion\",\n KAESO_PICKER_POPOVER_VARIANTS.width[width].classes,\n )}\n >\n <CommandListHeightContext.Provider value=\"popover\">{children}</CommandListHeightContext.Provider>\n </BasePopover.Popup>\n </BasePopover.Positioner>\n </BasePopover.Portal>\n </BasePopover.Root>\n );\n}\nif (process.env.NODE_ENV !== \"production\") PickerPopover.displayName = \"PickerPopover\";\n\nexport interface PickerTriggerProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"children\"> {\n appearance?: keyof typeof KAESO_SELECT_VARIANTS.appearance | undefined;\n size?: keyof typeof KAESO_SELECT_VARIANTS.size | undefined;\n fullWidth?: boolean | undefined;\n invalid?: boolean | undefined;\n placeholder?: ReactNode | undefined;\n children?: ReactNode | undefined;\n \"aria-label\"?: string | undefined;\n \"data-force\"?: string | undefined;\n}\n\nexport const PickerTrigger = /* @__PURE__ */ forwardRef<HTMLButtonElement, PickerTriggerProps>(function PickerTrigger(\n {\n appearance = \"default\",\n size = \"md\",\n fullWidth,\n invalid,\n placeholder,\n children,\n className,\n type = \"button\",\n \"aria-label\": ariaLabel,\n \"aria-describedby\": describedBy,\n ...props\n },\n ref,\n) {\n const empty = children === undefined || children === null || children === false;\n const shows = showsText(empty ? placeholder : children);\n const purpose = useHiddenDescription(shows ? ariaLabel : undefined);\n const descriptions = joinIds(purpose.id, describedBy);\n return (\n <>\n <button\n ref={ref}\n type={type}\n data-picker=\"\"\n {...props}\n {...(!shows && ariaLabel ? { \"aria-label\": ariaLabel } : {})}\n {...(descriptions ? { \"aria-describedby\": descriptions } : {})}\n {...(invalid ? { \"aria-invalid\": true } : {})}\n className={cn(\n \"inline-flex min-w-0 cursor-pointer items-center justify-between rounded-pill font-medium whitespace-nowrap transition-control focus-ring disabled:cursor-not-allowed\",\n KAESO_SELECT_VARIANTS.size[size].classes,\n KAESO_SELECT_VARIANTS.appearance[appearance].classes,\n invalid && \"ring-invalid\",\n fullWidth && \"w-full\",\n className,\n )}\n >\n <span className={cn(\"flex min-w-0 flex-1 items-center truncate text-left\", empty && \"font-regular text-fg-tertiary\")}>\n {empty ? placeholder : children}\n </span>\n <span className=\"flex shrink-0 text-fg-tertiary\">\n <Icon icon={__icon_ArrowDown01Icon} size=\"sm\" />\n </span>\n </button>\n {purpose.node}\n </>\n );\n});\nif (process.env.NODE_ENV !== \"production\") PickerTrigger.displayName = \"PickerTrigger\";\n"],"mappings":"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"}
@@ -2,10 +2,10 @@
2
2
  import { i as e } from "./styles-CVJU9t9v.js";
3
3
  import { t } from "./cn-DUDmdLpZ.js";
4
4
  import { i as n } from "./context-BELWW79w.js";
5
- import { n as r } from "./button-CAPyW-v8.js";
5
+ import { n as r } from "./button-h2IFCER2.js";
6
6
  import { i } from "./popover-bjxg020P.js";
7
- import { t as a } from "./calendar-CBeptQFq.js";
8
- import { t as o } from "./iso-field-BUXgY1dB.js";
7
+ import { t as a } from "./calendar-cVuezHQ6.js";
8
+ import { t as o } from "./iso-field-DAa6iPWn.js";
9
9
  import { useState as s, useSyncExternalStore as c } from "react";
10
10
  import { jsx as l, jsxs as u } from "react/jsx-runtime";
11
11
  //#region src/components/date-picker/range-popup.tsx
@@ -125,4 +125,4 @@ function y({ range: c, preset: f, presets: p, onPick: m, onClose: y, weekStartsO
125
125
  //#endregion
126
126
  export { y as RangePopup };
127
127
 
128
- //# sourceMappingURL=range-popup-CG9Jo5B7.js.map
128
+ //# sourceMappingURL=range-popup-ZunS8QSH.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"range-popup-CG9Jo5B7.js","names":["MENU_ITEM","useUiText","Button","Calendar","IsoField","moveAmongOptions","options","at","step","columns","to","NARROW","subscribeNarrow","q","onChange","isNarrow","useWide","useSyncExternalStore","monthOf","d","addMonths","n","sameDay","a","b","RangePopup","wide","t","months","draft","setDraft","useState","range","custom","setCustom","preset","last","setLast","first","shows","selected","edit","next","typed","disabledDays","other","which","unchanged","item","cn","Popover","presets","id","p","onPick","m","r","onClose"],"sources":["../../src/components/date-picker/range-popup.tsx"],"sourcesContent":["import { useState, useSyncExternalStore, type KeyboardEvent } from \"react\";\nimport type { DateRange } from \"react-day-picker\";\nimport { Calendar, type CalendarProps } from \"../calendar/calendar.js\";\nimport { cn } from \"../../utils/cn.js\";\nimport { Popover } from \"../popover/popover.js\";\nimport { Button } from \"../button/button.js\";\nimport { MENU_ITEM } from \"../menu/styles.js\";\nimport { IsoField } from \"./iso-field.js\";\nimport type { DateRangePreset } from \"./date-picker.js\";\nimport { useUiText } from \"../../i18n/context.js\";\n\nfunction moveAmongOptions(e: KeyboardEvent<HTMLDivElement>, columns: number) {\n const options = [...e.currentTarget.querySelectorAll<HTMLElement>(\"[role=option]\")];\n const at = options.indexOf(document.activeElement as HTMLElement);\n if (at < 0) return;\n const step: Record<string, number> = { ArrowDown: columns, ArrowUp: -columns, ...(columns > 1 ? { ArrowRight: 1, ArrowLeft: -1 } : {}) };\n const to = e.key === \"Home\" ? 0 : e.key === \"End\" ? options.length - 1 : step[e.key] !== undefined ? at + step[e.key]! : null;\n if (to === null) return;\n e.preventDefault();\n options[Math.max(0, Math.min(options.length - 1, to))]?.focus();\n}\n\nexport interface RangePopupProps {\n range: DateRange | null;\n preset: string | null;\n presets: DateRangePreset[];\n onPick: (range: DateRange, preset: string | null) => void;\n onClose: () => void;\n weekStartsOn: CalendarProps[\"weekStartsOn\"];\n disabledDays: ((date: Date) => boolean) | undefined;\n}\n\nconst NARROW = \"(max-width: 767px)\";\nfunction subscribeNarrow(onChange: () => void) {\n if (typeof window === \"undefined\" || !window.matchMedia) return () => {};\n const q = window.matchMedia(NARROW);\n q.addEventListener(\"change\", onChange);\n return () => q.removeEventListener(\"change\", onChange);\n}\nconst isNarrow = () => typeof window !== \"undefined\" && !!window.matchMedia?.(NARROW).matches;\nconst useWide = () => !useSyncExternalStore(subscribeNarrow, isNarrow, () => false);\n\nconst monthOf = (d: Date) => new Date(d.getFullYear(), d.getMonth(), 1);\nconst addMonths = (d: Date, n: number) => new Date(d.getFullYear(), d.getMonth() + n, 1);\nconst sameDay = (a: Date | undefined, b: Date | undefined) => a?.toDateString() === b?.toDateString();\n\nexport function RangePopup({ range, preset, presets, onPick, onClose, weekStartsOn, disabledDays }: RangePopupProps) {\n const wide = useWide();\n const t = useUiText();\n const months = wide ? 2 : 1;\n const [draft, setDraft] = useState<DateRange | undefined>(range ?? undefined);\n const [custom, setCustom] = useState(preset === null);\n const [last, setLast] = useState(() => monthOf(range?.to ?? range?.from ?? new Date()));\n const first = addMonths(last, 1 - months);\n const shows = (d: Date) => d >= first && monthOf(d) <= last;\n const selected = custom ? null : preset;\n const edit = (next: DateRange | undefined) => {\n setDraft(next);\n setCustom(true);\n };\n const typed = (which: \"from\" | \"to\", d: Date) => {\n if (disabledDays?.(d)) return false;\n const other = which === \"from\" ? draft?.to : draft?.from;\n const next = which === \"from\" ? { from: d, to: other && other < d ? d : other } : { from: other && other > d ? d : other, to: d };\n edit(next);\n if (!shows(d)) setLast(which === \"to\" || months === 1 ? monthOf(d) : addMonths(monthOf(d), months - 1));\n return true;\n };\n const unchanged = sameDay(draft?.from, range?.from) && sameDay(draft?.to ?? draft?.from, range?.to);\n const item = cn(MENU_ITEM, \"cursor-pointer hover:bg-fill-1 focus-ring-inset aria-selected:bg-fill-2\", wide && \"coarse:min-h-40\");\n\n return (\n <Popover.Content padding=\"none\" aria-label={t(\"datePicker.chooseRange\", \"Choose a date range\")} className={cn(!wide && \"w-360 max-w-(--available-width)\")}>\n <div className={cn(\"flex\", !wide && \"flex-col\")}>\n <div\n className={cn(\"shrink-0 gap-2 p-6\", wide ? \"flex min-w-160 flex-col hairline-r\" : \"grid grid-cols-2 hairline-b\")}\n role=\"listbox\"\n aria-label={t(\"datePicker.presets\", \"Presets\")}\n aria-orientation={wide ? \"vertical\" : undefined}\n onKeyDown={(e) => moveAmongOptions(e, wide ? 1 : 2)}\n >\n {presets.map((p) => {\n const id = p.id ?? p.label;\n return (\n <button\n key={id}\n type=\"button\"\n role=\"option\"\n aria-selected={selected === id}\n tabIndex={selected === id ? 0 : -1}\n className={item}\n onClick={() => onPick(p.range(), id)}\n >\n {p.label}\n </button>\n );\n })}\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={selected === null}\n tabIndex={selected === null || !presets.some((p) => (p.id ?? p.label) === selected) ? 0 : -1}\n className={item}\n onClick={() => setCustom(true)}\n >\n {t(\"datePicker.custom\", \"Custom\")}\n </button>\n </div>\n <div className={cn(\"flex flex-col p-12\", !wide && \"items-center\")}>\n <Calendar\n mode=\"range\"\n numberOfMonths={months}\n selected={draft}\n month={first}\n onMonthChange={(m) => setLast(addMonths(m, months - 1))}\n onSelect={(r) => edit(r as DateRange | undefined)}\n weekStartsOn={weekStartsOn}\n disabled={disabledDays}\n />\n <div className=\"mt-12 flex items-center gap-8 self-stretch\">\n <IsoField label={t(\"datePicker.startDate\", \"Start date\")} value={draft?.from} onCommit={(d) => typed(\"from\", d)} />\n <span className=\"text-fg-tertiary\" aria-hidden>\n –\n </span>\n <IsoField label={t(\"datePicker.endDate\", \"End date\")} value={draft?.to} onCommit={(d) => typed(\"to\", d)} />\n <Button\n size=\"sm\"\n variant=\"primary\"\n disabled={!draft?.from}\n onClick={() => {\n if (!draft?.from) return;\n if (unchanged && !custom) onClose();\n else onPick({ from: draft.from, to: draft.to ?? draft.from }, null);\n }}\n >\n {t(\"datePicker.apply\", \"Apply\")}\n </Button>\n </div>\n </div>\n </div>\n </Popover.Content>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"range-popup-ZunS8QSH.js","names":["MENU_ITEM","useUiText","Button","Calendar","IsoField","moveAmongOptions","options","at","step","columns","to","NARROW","subscribeNarrow","q","onChange","isNarrow","useWide","useSyncExternalStore","monthOf","d","addMonths","n","sameDay","a","b","RangePopup","wide","t","months","draft","setDraft","useState","range","custom","setCustom","preset","last","setLast","first","shows","selected","edit","next","typed","disabledDays","other","which","unchanged","item","cn","Popover","presets","id","p","onPick","m","r","onClose"],"sources":["../../src/components/date-picker/range-popup.tsx"],"sourcesContent":["import { useState, useSyncExternalStore, type KeyboardEvent } from \"react\";\nimport type { DateRange } from \"react-day-picker\";\nimport { Calendar, type CalendarProps } from \"../calendar/calendar.js\";\nimport { cn } from \"../../utils/cn.js\";\nimport { Popover } from \"../popover/popover.js\";\nimport { Button } from \"../button/button.js\";\nimport { MENU_ITEM } from \"../menu/styles.js\";\nimport { IsoField } from \"./iso-field.js\";\nimport type { DateRangePreset } from \"./date-picker.js\";\nimport { useUiText } from \"../../i18n/context.js\";\n\nfunction moveAmongOptions(e: KeyboardEvent<HTMLDivElement>, columns: number) {\n const options = [...e.currentTarget.querySelectorAll<HTMLElement>(\"[role=option]\")];\n const at = options.indexOf(document.activeElement as HTMLElement);\n if (at < 0) return;\n const step: Record<string, number> = { ArrowDown: columns, ArrowUp: -columns, ...(columns > 1 ? { ArrowRight: 1, ArrowLeft: -1 } : {}) };\n const to = e.key === \"Home\" ? 0 : e.key === \"End\" ? options.length - 1 : step[e.key] !== undefined ? at + step[e.key]! : null;\n if (to === null) return;\n e.preventDefault();\n options[Math.max(0, Math.min(options.length - 1, to))]?.focus();\n}\n\nexport interface RangePopupProps {\n range: DateRange | null;\n preset: string | null;\n presets: DateRangePreset[];\n onPick: (range: DateRange, preset: string | null) => void;\n onClose: () => void;\n weekStartsOn: CalendarProps[\"weekStartsOn\"];\n disabledDays: ((date: Date) => boolean) | undefined;\n}\n\nconst NARROW = \"(max-width: 767px)\";\nfunction subscribeNarrow(onChange: () => void) {\n if (typeof window === \"undefined\" || !window.matchMedia) return () => {};\n const q = window.matchMedia(NARROW);\n q.addEventListener(\"change\", onChange);\n return () => q.removeEventListener(\"change\", onChange);\n}\nconst isNarrow = () => typeof window !== \"undefined\" && !!window.matchMedia?.(NARROW).matches;\nconst useWide = () => !useSyncExternalStore(subscribeNarrow, isNarrow, () => false);\n\nconst monthOf = (d: Date) => new Date(d.getFullYear(), d.getMonth(), 1);\nconst addMonths = (d: Date, n: number) => new Date(d.getFullYear(), d.getMonth() + n, 1);\nconst sameDay = (a: Date | undefined, b: Date | undefined) => a?.toDateString() === b?.toDateString();\n\nexport function RangePopup({ range, preset, presets, onPick, onClose, weekStartsOn, disabledDays }: RangePopupProps) {\n const wide = useWide();\n const t = useUiText();\n const months = wide ? 2 : 1;\n const [draft, setDraft] = useState<DateRange | undefined>(range ?? undefined);\n const [custom, setCustom] = useState(preset === null);\n const [last, setLast] = useState(() => monthOf(range?.to ?? range?.from ?? new Date()));\n const first = addMonths(last, 1 - months);\n const shows = (d: Date) => d >= first && monthOf(d) <= last;\n const selected = custom ? null : preset;\n const edit = (next: DateRange | undefined) => {\n setDraft(next);\n setCustom(true);\n };\n const typed = (which: \"from\" | \"to\", d: Date) => {\n if (disabledDays?.(d)) return false;\n const other = which === \"from\" ? draft?.to : draft?.from;\n const next = which === \"from\" ? { from: d, to: other && other < d ? d : other } : { from: other && other > d ? d : other, to: d };\n edit(next);\n if (!shows(d)) setLast(which === \"to\" || months === 1 ? monthOf(d) : addMonths(monthOf(d), months - 1));\n return true;\n };\n const unchanged = sameDay(draft?.from, range?.from) && sameDay(draft?.to ?? draft?.from, range?.to);\n const item = cn(MENU_ITEM, \"cursor-pointer hover:bg-fill-1 focus-ring-inset aria-selected:bg-fill-2\", wide && \"coarse:min-h-40\");\n\n return (\n <Popover.Content padding=\"none\" aria-label={t(\"datePicker.chooseRange\", \"Choose a date range\")} className={cn(!wide && \"w-360 max-w-(--available-width)\")}>\n <div className={cn(\"flex\", !wide && \"flex-col\")}>\n <div\n className={cn(\"shrink-0 gap-2 p-6\", wide ? \"flex min-w-160 flex-col hairline-r\" : \"grid grid-cols-2 hairline-b\")}\n role=\"listbox\"\n aria-label={t(\"datePicker.presets\", \"Presets\")}\n aria-orientation={wide ? \"vertical\" : undefined}\n onKeyDown={(e) => moveAmongOptions(e, wide ? 1 : 2)}\n >\n {presets.map((p) => {\n const id = p.id ?? p.label;\n return (\n <button\n key={id}\n type=\"button\"\n role=\"option\"\n aria-selected={selected === id}\n tabIndex={selected === id ? 0 : -1}\n className={item}\n onClick={() => onPick(p.range(), id)}\n >\n {p.label}\n </button>\n );\n })}\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={selected === null}\n tabIndex={selected === null || !presets.some((p) => (p.id ?? p.label) === selected) ? 0 : -1}\n className={item}\n onClick={() => setCustom(true)}\n >\n {t(\"datePicker.custom\", \"Custom\")}\n </button>\n </div>\n <div className={cn(\"flex flex-col p-12\", !wide && \"items-center\")}>\n <Calendar\n mode=\"range\"\n numberOfMonths={months}\n selected={draft}\n month={first}\n onMonthChange={(m) => setLast(addMonths(m, months - 1))}\n onSelect={(r) => edit(r as DateRange | undefined)}\n weekStartsOn={weekStartsOn}\n disabled={disabledDays}\n />\n <div className=\"mt-12 flex items-center gap-8 self-stretch\">\n <IsoField label={t(\"datePicker.startDate\", \"Start date\")} value={draft?.from} onCommit={(d) => typed(\"from\", d)} />\n <span className=\"text-fg-tertiary\" aria-hidden>\n –\n </span>\n <IsoField label={t(\"datePicker.endDate\", \"End date\")} value={draft?.to} onCommit={(d) => typed(\"to\", d)} />\n <Button\n size=\"sm\"\n variant=\"primary\"\n disabled={!draft?.from}\n onClick={() => {\n if (!draft?.from) return;\n if (unchanged && !custom) onClose();\n else onPick({ from: draft.from, to: draft.to ?? draft.from }, null);\n }}\n >\n {t(\"datePicker.apply\", \"Apply\")}\n </Button>\n </div>\n </div>\n </div>\n </Popover.Content>\n );\n}\n"],"mappings":"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"}
@@ -2,10 +2,10 @@
2
2
  import { t as e } from "./cn-DUDmdLpZ.js";
3
3
  import { i as t } from "./context-BELWW79w.js";
4
4
  import { t as n } from "./icon-BqujXDUc.js";
5
- import { r } from "./tooltip-S1DmyLVl.js";
6
- import { i } from "./input-B0wtkcNh.js";
5
+ import { r } from "./tooltip-CTBnfiDH.js";
6
+ import { i } from "./input-9y3afoiq.js";
7
7
  import { n as a } from "./checkbox-C5yvSS7O.js";
8
- import { r as o } from "./combobox-DqtzsAKG.js";
8
+ import { r as o } from "./combobox-B9ttar4C.js";
9
9
  import { t as s } from "./empty-YXmSkKzR.js";
10
10
  import { t as c } from "./badge-wUHlj7m3.js";
11
11
  import { forwardRef as l, useEffect as u, useId as d, useMemo as f, useRef as p, useState as m } from "react";
@@ -276,4 +276,4 @@ function D({ right: i, readOnly: s, query: l, hasOrigin: u, originText: f, names
276
276
  //#endregion
277
277
  export { b as a, x as i, S as n, E as r, C as t };
278
278
 
279
- //# sourceMappingURL=rights-hMoaFasn.js.map
279
+ //# sourceMappingURL=rights-CiIBzT9o.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rights-hMoaFasn.js","names":["__icon_Alert02Icon","__icon_Tick02Icon","__icon_MinusSignIcon","cn","useUiText","Icon","CheckboxBox","Highlight","Empty","Badge","rightsCascade","byCode","rights","r","dependents","req","out","seen","code","queue","next","linked","granted","c","groupCascade","state","all","group","current","n","g","KAESO_RIGHTS_MATRIX_VARIANTS","KAESO_RIGHTS_MATRIX_DEFAULT_VARIANTS","originTexts","t","matches","texts","q","RightsMatrix","ariaLabel","query","setQuery","useState","announcement","setAnnouncement","flashed","setFlashed","flashTimer","useRef","root","baseId","useId","useMemo","groups","names","universal","required","hasOrigins","originText","originLabels","shown","apply","changes","onRightsChange","onChange","first","rest","also","el","ref","target","boxes","i","className","searchable","SearchInput","headingId","gi","grantedCount","changeable","allOn","someOn","readOnly","RightRow","descId","nameId","name","needs","text","Tooltip","Alert02Icon","hasOrigin","s","Tick02Icon","MinusSignIcon","row","onToggle"],"sources":["../../src/components/kaeso/rights-logic.ts","../../src/components/kaeso/rights.tsx"],"sourcesContent":["export interface RightChange {\n code: string;\n granted: boolean;\n}\n\ninterface Node {\n code: string;\n granted: boolean;\n requires?: string[] | undefined;\n disabled?: boolean | undefined;\n}\n\nexport function rightsCascade(rights: readonly Node[], code: string, granted: boolean): RightChange[] {\n const byCode = new Map(rights.map((r) => [r.code, r]));\n const dependents = new Map<string, string[]>();\n for (const r of rights) for (const req of r.requires ?? []) dependents.set(req, [...(dependents.get(req) ?? []), r.code]);\n const out: RightChange[] = [{ code, granted }];\n const seen = new Set([code]);\n const queue = [code];\n while (queue.length) {\n const next = queue.shift() as string;\n const linked = granted ? (byCode.get(next)?.requires ?? []) : (dependents.get(next) ?? []);\n for (const c of linked) {\n if (seen.has(c)) continue;\n seen.add(c);\n const r = byCode.get(c);\n if (!r || r.disabled) continue;\n queue.push(c);\n if (r.granted !== granted) out.push({ code: c, granted });\n }\n }\n return out;\n}\n\nexport function groupCascade(all: readonly Node[], group: readonly Node[], granted: boolean): RightChange[] {\n const state = new Map(all.map((r) => [r.code, r.granted]));\n const out = new Map<string, boolean>();\n for (const r of group) {\n if (r.disabled || state.get(r.code) === granted) continue;\n const current = all.map((n) => ({ ...n, granted: out.get(n.code) ?? n.granted }));\n for (const c of rightsCascade(current, r.code, granted)) {\n out.set(c.code, c.granted);\n state.set(c.code, c.granted);\n }\n }\n return [...out].map(([code, g]) => ({ code, granted: g }));\n}\n","import { forwardRef, useEffect, useId, useMemo, useRef, useState, type KeyboardEvent, type ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn.js\";\nimport { Alert02Icon as __icon_Alert02Icon, Tick02Icon as __icon_Tick02Icon, MinusSignIcon as __icon_MinusSignIcon } from \"@hugeicons/core-free-icons\";\nimport { Icon } from \"../icon/icon.js\";\nimport { CheckboxBox } from \"../checkbox/checkbox.js\";\nimport { Tooltip } from \"../tooltip/tooltip.js\";\nimport { SearchInput } from \"../input/input.js\";\nimport { Empty } from \"../empty/empty.js\";\nimport { Badge } from \"../badge/badge.js\";\nimport { Highlight } from \"../combobox/combobox.js\";\nimport { groupCascade, rightsCascade, type RightChange } from \"./rights-logic.js\";\nimport { useUiText, type UiText } from \"../../i18n/context.js\";\n\nexport const KAESO_RIGHTS_MATRIX_VARIANTS = {\n origin: {\n preset: { classes: \"text-fg-tertiary\" },\n added: { classes: \"text-success-text\" },\n removed: { classes: \"text-danger-text\" },\n none: { classes: \"\" },\n },\n mode: {\n edit: { classes: \"\" },\n readOnly: { classes: \"\" },\n },\n} as const;\nexport const KAESO_RIGHTS_MATRIX_DEFAULT_VARIANTS = { origin: \"none\", mode: \"edit\" } as const;\n\ntype Origin = keyof typeof KAESO_RIGHTS_MATRIX_VARIANTS.origin;\n\nexport interface RightSource {\n label: string;\n detail?: string | undefined;\n}\n\nexport interface Right {\n code: string;\n label?: string | undefined;\n description: string;\n granted: boolean;\n origin?: Origin | undefined;\n sensitive?: boolean | undefined;\n requires?: string[] | undefined;\n sources?: RightSource[] | undefined;\n disabled?: boolean | undefined;\n disabledReason?: string | undefined;\n}\n\nexport interface RightsGroup {\n label: string;\n description?: string | undefined;\n rights: Right[];\n}\n\nexport interface RightsMatrixProps {\n groups: RightsGroup[];\n onChange?: ((code: string, granted: boolean) => void) | undefined;\n onRightsChange?: ((changes: RightChange[]) => void) | undefined;\n readOnly?: boolean | undefined;\n searchable?: boolean | undefined;\n originLabels?: Partial<Record<Origin, string>> | undefined;\n \"aria-label\"?: string | undefined;\n className?: string | undefined;\n}\n\nfunction originTexts(t: UiText): Record<Origin, string> {\n return { preset: t(\"rightsMatrix.fromRole\", \"From role\"), added: t(\"rightsMatrix.added\", \"Added\"), removed: t(\"rightsMatrix.removed\", \"Removed\"), none: \"\" };\n}\n\nconst matches = (q: string, ...texts: (string | undefined)[]) => texts.some((t) => t?.toLowerCase().includes(q));\n\nexport const RightsMatrix = /* @__PURE__ */ forwardRef<HTMLDivElement, RightsMatrixProps>(function RightsMatrix(\n { groups, onChange, onRightsChange, readOnly, searchable, originLabels, \"aria-label\": ariaLabel, className },\n ref,\n) {\n const t = useUiText();\n const [query, setQuery] = useState(\"\");\n const [announcement, setAnnouncement] = useState(\"\");\n const [flashed, setFlashed] = useState<ReadonlySet<string>>(() => new Set());\n const flashTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n useEffect(() => () => clearTimeout(flashTimer.current), []);\n const root = useRef<HTMLDivElement | null>(null);\n const baseId = useId();\n const all = useMemo(() => groups.flatMap((g) => g.rights), [groups]);\n const names = useMemo(() => new Map(all.map((r) => [r.code, r.label ?? r.code])), [all]);\n const universal = useMemo(() => {\n if (all.length < 3) return new Set<string>();\n const required = new Set(all.flatMap((r) => r.requires ?? []));\n return new Set([...required].filter((c) => all.every((r) => r.code === c || r.requires?.includes(c))));\n }, [all]);\n const hasOrigins = all.some((r) => r.origin !== undefined);\n const originText = { ...originTexts(t), ...originLabels };\n const q = query.trim().toLowerCase();\n const shown = groups\n .map((g) => (!q || matches(q, g.label) ? g : { ...g, rights: g.rights.filter((r) => matches(q, r.label, r.code, r.description)) }))\n .filter((g) => g.rights.length > 0);\n\n const apply = (changes: RightChange[]) => {\n if (!changes.length) return;\n if (onRightsChange) onRightsChange(changes);\n else if (onChange) for (const c of changes) onChange(c.code, c.granted);\n const [first, ...rest] = changes;\n const also = rest.map((c) => names.get(c.code) ?? c.code);\n setAnnouncement(\n also.length && first\n ? first.granted\n ? t(\"rightsMatrix.alsoGranted\", \"Also granted {rights}\", { rights: also.join(t(\"rightsMatrix.listSeparator\", \", \")) })\n : t(\"rightsMatrix.alsoRemoved\", \"Also removed {rights}\", { rights: also.join(t(\"rightsMatrix.listSeparator\", \", \")) })\n : \"\",\n );\n clearTimeout(flashTimer.current);\n setFlashed(new Set(rest.map((c) => c.code)));\n if (rest.length) flashTimer.current = setTimeout(() => setFlashed(new Set()), 1200);\n };\n\n const onKeyDown = (e: KeyboardEvent<HTMLDivElement>) => {\n const target = e.target as HTMLElement;\n if (target.getAttribute(\"role\") !== \"checkbox\" || !root.current) return;\n const boxes = [...root.current.querySelectorAll<HTMLElement>('[role=\"checkbox\"]')];\n const i = boxes.indexOf(target);\n const next =\n e.key === \"ArrowDown\"\n ? boxes[i + 1]\n : e.key === \"ArrowUp\"\n ? boxes[i - 1]\n : e.key === \"Home\"\n ? boxes[0]\n : e.key === \"End\"\n ? boxes[boxes.length - 1]\n : undefined;\n if (!next) return;\n e.preventDefault();\n next.focus();\n };\n\n return (\n <div\n ref={(el) => {\n root.current = el;\n if (typeof ref === \"function\") ref(el);\n else if (ref) ref.current = el;\n }}\n role=\"group\"\n aria-label={ariaLabel ?? t(\"rightsMatrix.rights\", \"Rights\")}\n onKeyDown={onKeyDown}\n className={cn(\"@container flex min-w-0 flex-col gap-24\", className)}\n >\n {searchable && (\n <SearchInput\n className=\"w-full\"\n aria-label={t(\"rightsMatrix.searchRights\", \"Search rights\")}\n placeholder={t(\"rightsMatrix.searchRights\", \"Search rights\")}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onClear={() => setQuery(\"\")}\n />\n )}\n {shown.length === 0 && (\n <Empty\n size=\"compact\"\n title={t(\"rightsMatrix.noMatch\", \"No rights match\")}\n description={t(\"rightsMatrix.noMatchHint\", \"Try a right's name, its code, or a word from its description.\")}\n />\n )}\n {shown.map((g, gi) => {\n const headingId = `${baseId}-g${gi}`;\n const grantedCount = g.rights.filter((r) => r.granted).length;\n const changeable = g.rights.filter((r) => !r.disabled);\n const allOn = changeable.length > 0 && changeable.every((r) => r.granted);\n const someOn = changeable.some((r) => r.granted);\n return (\n <section key={g.label} aria-labelledby={headingId} className=\"flex min-w-0 flex-col\">\n <div className=\"flex items-start gap-12 px-12 pb-4\">\n {!readOnly && (\n <span className=\"flex h-20 items-center\">\n <CheckboxBox\n aria-label={\n q\n ? t(\"rightsMatrix.everyRightShownIn\", \"Every right shown in {group}\", { group: g.label })\n : t(\"rightsMatrix.everyRightIn\", \"Every right in {group}\", { group: g.label })\n }\n checked={allOn}\n indeterminate={someOn && !allOn}\n disabled={changeable.length === 0}\n onCheckedChange={() => apply(groupCascade(all, g.rights, !allOn))}\n />\n </span>\n )}\n <span className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"flex items-baseline justify-between gap-12\">\n <span id={headingId} className=\"min-w-0 wrap-break-word text-body font-semibold text-fg\">\n {g.label}\n </span>\n <span className=\"shrink-0 text-small text-fg-tertiary tabular\">\n {t(\"rightsMatrix.grantedOfTotal\", \"{granted} of {total}\", { granted: grantedCount, total: g.rights.length })}\n </span>\n </span>\n {g.description && <span className=\"text-small text-fg-secondary text-pretty\">{g.description}</span>}\n </span>\n </div>\n {g.rights.map((r) => (\n <RightRow\n key={r.code}\n right={r}\n readOnly={!!readOnly}\n query={q}\n hasOrigin={hasOrigins}\n originText={originText}\n names={names}\n universal={universal}\n flashed={flashed.has(r.code)}\n onToggle={(granted) => apply(rightsCascade(all, r.code, granted))}\n />\n ))}\n </section>\n );\n })}\n <span aria-live=\"polite\" className=\"sr-only\">\n {announcement}\n </span>\n </div>\n );\n});\nif (process.env.NODE_ENV !== \"production\") RightsMatrix.displayName = \"RightsMatrix\";\n\nfunction RightRow({\n right: r,\n readOnly,\n query,\n hasOrigin,\n originText,\n names,\n universal,\n flashed,\n onToggle,\n}: {\n right: Right;\n readOnly: boolean;\n query: string;\n hasOrigin: boolean;\n originText: Record<Origin, string>;\n names: Map<string, string>;\n universal: ReadonlySet<string>;\n flashed: boolean;\n onToggle: (granted: boolean) => void;\n}) {\n const t = useUiText();\n const descId = useId();\n const nameId = useId();\n const name = r.label ?? r.code;\n const needs = readOnly ? [] : (r.requires ?? []).filter((c) => !universal.has(c)).map((c) => names.get(c) ?? c);\n const text: ReactNode = (\n <span className=\"flex min-w-0 flex-1 flex-col gap-2\">\n <span className=\"flex min-w-0 items-start gap-8\">\n <span\n id={nameId}\n className={cn(\n \"min-w-0 wrap-break-word\",\n r.label ? \"text-body font-medium\" : \"mono text-small\",\n readOnly && !r.granted ? \"text-fg-tertiary\" : \"text-fg\",\n )}\n >\n <Highlight text={name} query={query} />\n </span>\n {r.label && (\n <span className=\"hidden h-20 min-w-0 items-center @auth:flex\">\n <span className=\"min-w-0 truncate mono text-caption text-fg-tertiary\">{r.code}</span>\n </span>\n )}\n {r.sensitive && (\n <span className={cn(\"flex shrink-0 items-center\", r.label ? \"h-20\" : \"h-18\")}>\n <Tooltip content={t(\"rightsMatrix.sensitiveHint\", \"Sensitive: exposes data or is hard to undo\")}>\n <span tabIndex={0} className=\"inline-flex shrink-0 rounded-pill text-warning-text focus-ring\">\n <Icon icon={__icon_Alert02Icon} size=\"sm\" label={t(\"rightsMatrix.sensitive\", \"Sensitive\")} />\n </span>\n </Tooltip>\n </span>\n )}\n {hasOrigin && !readOnly && (\n <span\n className={cn(\n \"ml-auto flex w-80 shrink-0 items-center justify-end text-right text-small\",\n r.label ? \"h-20\" : \"h-18\",\n KAESO_RIGHTS_MATRIX_VARIANTS.origin[r.origin ?? \"none\"].classes,\n )}\n >\n {originText[r.origin ?? \"none\"]}\n </span>\n )}\n </span>\n <span id={descId} className={cn(\"text-small text-pretty\", readOnly && !r.granted ? \"text-fg-tertiary\" : \"text-fg-secondary\")}>\n {r.description}\n </span>\n {needs.length > 0 && (\n <span className=\"text-caption text-fg-tertiary\">\n {t(\"rightsMatrix.needs\", \"Needs {rights}\", { rights: needs.join(t(\"rightsMatrix.listSeparator\", \", \")) })}\n </span>\n )}\n {readOnly && r.granted && !!r.sources?.length && (\n <span className=\"flex flex-wrap gap-4 pt-4\">\n {r.sources.map((s) =>\n s.detail ? (\n <Tooltip key={s.label} content={s.detail}>\n <Badge tabIndex={0} className=\"focus-ring\">\n {s.label}\n </Badge>\n </Tooltip>\n ) : (\n <Badge key={s.label}>{s.label}</Badge>\n ),\n )}\n </span>\n )}\n </span>\n );\n\n if (readOnly) {\n return (\n <div className=\"flex min-h-52 items-start gap-12 px-12 py-8\">\n <span className=\"flex h-20 w-18 shrink-0 items-center justify-center\">\n <Icon\n icon={r.granted ? __icon_Tick02Icon : __icon_MinusSignIcon}\n size=\"sm\"\n className={r.granted ? \"text-fg\" : \"text-fg-disabled\"}\n label={r.granted ? t(\"rightsMatrix.granted\", \"Granted\") : t(\"rightsMatrix.notGranted\", \"Not granted\")}\n />\n </span>\n {text}\n </div>\n );\n }\n\n const row = (\n <label\n className={cn(\n \"flex min-h-52 cursor-pointer items-start gap-12 rounded-item px-12 py-8 transition-control hover:bg-fill-1\",\n flashed && \"bg-fill-2 hover:bg-fill-2\",\n r.disabled && \"cursor-not-allowed\",\n )}\n >\n <span className=\"flex h-20 items-center\">\n <CheckboxBox checked={r.granted} disabled={r.disabled} onCheckedChange={onToggle} aria-labelledby={nameId} aria-describedby={descId} />\n </span>\n {text}\n </label>\n );\n return r.disabled && r.disabledReason ? <Tooltip content={r.disabledReason}>{row}</Tooltip> : row;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"rights-CiIBzT9o.js","names":["__icon_Alert02Icon","__icon_Tick02Icon","__icon_MinusSignIcon","cn","useUiText","Icon","CheckboxBox","Highlight","Empty","Badge","rightsCascade","byCode","rights","r","dependents","req","out","seen","code","queue","next","linked","granted","c","groupCascade","state","all","group","current","n","g","KAESO_RIGHTS_MATRIX_VARIANTS","KAESO_RIGHTS_MATRIX_DEFAULT_VARIANTS","originTexts","t","matches","texts","q","RightsMatrix","ariaLabel","query","setQuery","useState","announcement","setAnnouncement","flashed","setFlashed","flashTimer","useRef","root","baseId","useId","useMemo","groups","names","universal","required","hasOrigins","originText","originLabels","shown","apply","changes","onRightsChange","onChange","first","rest","also","el","ref","target","boxes","i","className","searchable","SearchInput","headingId","gi","grantedCount","changeable","allOn","someOn","readOnly","RightRow","descId","nameId","name","needs","text","Tooltip","Alert02Icon","hasOrigin","s","Tick02Icon","MinusSignIcon","row","onToggle"],"sources":["../../src/components/kaeso/rights-logic.ts","../../src/components/kaeso/rights.tsx"],"sourcesContent":["export interface RightChange {\n code: string;\n granted: boolean;\n}\n\ninterface Node {\n code: string;\n granted: boolean;\n requires?: string[] | undefined;\n disabled?: boolean | undefined;\n}\n\nexport function rightsCascade(rights: readonly Node[], code: string, granted: boolean): RightChange[] {\n const byCode = new Map(rights.map((r) => [r.code, r]));\n const dependents = new Map<string, string[]>();\n for (const r of rights) for (const req of r.requires ?? []) dependents.set(req, [...(dependents.get(req) ?? []), r.code]);\n const out: RightChange[] = [{ code, granted }];\n const seen = new Set([code]);\n const queue = [code];\n while (queue.length) {\n const next = queue.shift() as string;\n const linked = granted ? (byCode.get(next)?.requires ?? []) : (dependents.get(next) ?? []);\n for (const c of linked) {\n if (seen.has(c)) continue;\n seen.add(c);\n const r = byCode.get(c);\n if (!r || r.disabled) continue;\n queue.push(c);\n if (r.granted !== granted) out.push({ code: c, granted });\n }\n }\n return out;\n}\n\nexport function groupCascade(all: readonly Node[], group: readonly Node[], granted: boolean): RightChange[] {\n const state = new Map(all.map((r) => [r.code, r.granted]));\n const out = new Map<string, boolean>();\n for (const r of group) {\n if (r.disabled || state.get(r.code) === granted) continue;\n const current = all.map((n) => ({ ...n, granted: out.get(n.code) ?? n.granted }));\n for (const c of rightsCascade(current, r.code, granted)) {\n out.set(c.code, c.granted);\n state.set(c.code, c.granted);\n }\n }\n return [...out].map(([code, g]) => ({ code, granted: g }));\n}\n","import { forwardRef, useEffect, useId, useMemo, useRef, useState, type KeyboardEvent, type ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn.js\";\nimport { Alert02Icon as __icon_Alert02Icon, Tick02Icon as __icon_Tick02Icon, MinusSignIcon as __icon_MinusSignIcon } from \"@hugeicons/core-free-icons\";\nimport { Icon } from \"../icon/icon.js\";\nimport { CheckboxBox } from \"../checkbox/checkbox.js\";\nimport { Tooltip } from \"../tooltip/tooltip.js\";\nimport { SearchInput } from \"../input/input.js\";\nimport { Empty } from \"../empty/empty.js\";\nimport { Badge } from \"../badge/badge.js\";\nimport { Highlight } from \"../combobox/combobox.js\";\nimport { groupCascade, rightsCascade, type RightChange } from \"./rights-logic.js\";\nimport { useUiText, type UiText } from \"../../i18n/context.js\";\n\nexport const KAESO_RIGHTS_MATRIX_VARIANTS = {\n origin: {\n preset: { classes: \"text-fg-tertiary\" },\n added: { classes: \"text-success-text\" },\n removed: { classes: \"text-danger-text\" },\n none: { classes: \"\" },\n },\n mode: {\n edit: { classes: \"\" },\n readOnly: { classes: \"\" },\n },\n} as const;\nexport const KAESO_RIGHTS_MATRIX_DEFAULT_VARIANTS = { origin: \"none\", mode: \"edit\" } as const;\n\ntype Origin = keyof typeof KAESO_RIGHTS_MATRIX_VARIANTS.origin;\n\nexport interface RightSource {\n label: string;\n detail?: string | undefined;\n}\n\nexport interface Right {\n code: string;\n label?: string | undefined;\n description: string;\n granted: boolean;\n origin?: Origin | undefined;\n sensitive?: boolean | undefined;\n requires?: string[] | undefined;\n sources?: RightSource[] | undefined;\n disabled?: boolean | undefined;\n disabledReason?: string | undefined;\n}\n\nexport interface RightsGroup {\n label: string;\n description?: string | undefined;\n rights: Right[];\n}\n\nexport interface RightsMatrixProps {\n groups: RightsGroup[];\n onChange?: ((code: string, granted: boolean) => void) | undefined;\n onRightsChange?: ((changes: RightChange[]) => void) | undefined;\n readOnly?: boolean | undefined;\n searchable?: boolean | undefined;\n originLabels?: Partial<Record<Origin, string>> | undefined;\n \"aria-label\"?: string | undefined;\n className?: string | undefined;\n}\n\nfunction originTexts(t: UiText): Record<Origin, string> {\n return { preset: t(\"rightsMatrix.fromRole\", \"From role\"), added: t(\"rightsMatrix.added\", \"Added\"), removed: t(\"rightsMatrix.removed\", \"Removed\"), none: \"\" };\n}\n\nconst matches = (q: string, ...texts: (string | undefined)[]) => texts.some((t) => t?.toLowerCase().includes(q));\n\nexport const RightsMatrix = /* @__PURE__ */ forwardRef<HTMLDivElement, RightsMatrixProps>(function RightsMatrix(\n { groups, onChange, onRightsChange, readOnly, searchable, originLabels, \"aria-label\": ariaLabel, className },\n ref,\n) {\n const t = useUiText();\n const [query, setQuery] = useState(\"\");\n const [announcement, setAnnouncement] = useState(\"\");\n const [flashed, setFlashed] = useState<ReadonlySet<string>>(() => new Set());\n const flashTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n useEffect(() => () => clearTimeout(flashTimer.current), []);\n const root = useRef<HTMLDivElement | null>(null);\n const baseId = useId();\n const all = useMemo(() => groups.flatMap((g) => g.rights), [groups]);\n const names = useMemo(() => new Map(all.map((r) => [r.code, r.label ?? r.code])), [all]);\n const universal = useMemo(() => {\n if (all.length < 3) return new Set<string>();\n const required = new Set(all.flatMap((r) => r.requires ?? []));\n return new Set([...required].filter((c) => all.every((r) => r.code === c || r.requires?.includes(c))));\n }, [all]);\n const hasOrigins = all.some((r) => r.origin !== undefined);\n const originText = { ...originTexts(t), ...originLabels };\n const q = query.trim().toLowerCase();\n const shown = groups\n .map((g) => (!q || matches(q, g.label) ? g : { ...g, rights: g.rights.filter((r) => matches(q, r.label, r.code, r.description)) }))\n .filter((g) => g.rights.length > 0);\n\n const apply = (changes: RightChange[]) => {\n if (!changes.length) return;\n if (onRightsChange) onRightsChange(changes);\n else if (onChange) for (const c of changes) onChange(c.code, c.granted);\n const [first, ...rest] = changes;\n const also = rest.map((c) => names.get(c.code) ?? c.code);\n setAnnouncement(\n also.length && first\n ? first.granted\n ? t(\"rightsMatrix.alsoGranted\", \"Also granted {rights}\", { rights: also.join(t(\"rightsMatrix.listSeparator\", \", \")) })\n : t(\"rightsMatrix.alsoRemoved\", \"Also removed {rights}\", { rights: also.join(t(\"rightsMatrix.listSeparator\", \", \")) })\n : \"\",\n );\n clearTimeout(flashTimer.current);\n setFlashed(new Set(rest.map((c) => c.code)));\n if (rest.length) flashTimer.current = setTimeout(() => setFlashed(new Set()), 1200);\n };\n\n const onKeyDown = (e: KeyboardEvent<HTMLDivElement>) => {\n const target = e.target as HTMLElement;\n if (target.getAttribute(\"role\") !== \"checkbox\" || !root.current) return;\n const boxes = [...root.current.querySelectorAll<HTMLElement>('[role=\"checkbox\"]')];\n const i = boxes.indexOf(target);\n const next =\n e.key === \"ArrowDown\"\n ? boxes[i + 1]\n : e.key === \"ArrowUp\"\n ? boxes[i - 1]\n : e.key === \"Home\"\n ? boxes[0]\n : e.key === \"End\"\n ? boxes[boxes.length - 1]\n : undefined;\n if (!next) return;\n e.preventDefault();\n next.focus();\n };\n\n return (\n <div\n ref={(el) => {\n root.current = el;\n if (typeof ref === \"function\") ref(el);\n else if (ref) ref.current = el;\n }}\n role=\"group\"\n aria-label={ariaLabel ?? t(\"rightsMatrix.rights\", \"Rights\")}\n onKeyDown={onKeyDown}\n className={cn(\"@container flex min-w-0 flex-col gap-24\", className)}\n >\n {searchable && (\n <SearchInput\n className=\"w-full\"\n aria-label={t(\"rightsMatrix.searchRights\", \"Search rights\")}\n placeholder={t(\"rightsMatrix.searchRights\", \"Search rights\")}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onClear={() => setQuery(\"\")}\n />\n )}\n {shown.length === 0 && (\n <Empty\n size=\"compact\"\n title={t(\"rightsMatrix.noMatch\", \"No rights match\")}\n description={t(\"rightsMatrix.noMatchHint\", \"Try a right's name, its code, or a word from its description.\")}\n />\n )}\n {shown.map((g, gi) => {\n const headingId = `${baseId}-g${gi}`;\n const grantedCount = g.rights.filter((r) => r.granted).length;\n const changeable = g.rights.filter((r) => !r.disabled);\n const allOn = changeable.length > 0 && changeable.every((r) => r.granted);\n const someOn = changeable.some((r) => r.granted);\n return (\n <section key={g.label} aria-labelledby={headingId} className=\"flex min-w-0 flex-col\">\n <div className=\"flex items-start gap-12 px-12 pb-4\">\n {!readOnly && (\n <span className=\"flex h-20 items-center\">\n <CheckboxBox\n aria-label={\n q\n ? t(\"rightsMatrix.everyRightShownIn\", \"Every right shown in {group}\", { group: g.label })\n : t(\"rightsMatrix.everyRightIn\", \"Every right in {group}\", { group: g.label })\n }\n checked={allOn}\n indeterminate={someOn && !allOn}\n disabled={changeable.length === 0}\n onCheckedChange={() => apply(groupCascade(all, g.rights, !allOn))}\n />\n </span>\n )}\n <span className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"flex items-baseline justify-between gap-12\">\n <span id={headingId} className=\"min-w-0 wrap-break-word text-body font-semibold text-fg\">\n {g.label}\n </span>\n <span className=\"shrink-0 text-small text-fg-tertiary tabular\">\n {t(\"rightsMatrix.grantedOfTotal\", \"{granted} of {total}\", { granted: grantedCount, total: g.rights.length })}\n </span>\n </span>\n {g.description && <span className=\"text-small text-fg-secondary text-pretty\">{g.description}</span>}\n </span>\n </div>\n {g.rights.map((r) => (\n <RightRow\n key={r.code}\n right={r}\n readOnly={!!readOnly}\n query={q}\n hasOrigin={hasOrigins}\n originText={originText}\n names={names}\n universal={universal}\n flashed={flashed.has(r.code)}\n onToggle={(granted) => apply(rightsCascade(all, r.code, granted))}\n />\n ))}\n </section>\n );\n })}\n <span aria-live=\"polite\" className=\"sr-only\">\n {announcement}\n </span>\n </div>\n );\n});\nif (process.env.NODE_ENV !== \"production\") RightsMatrix.displayName = \"RightsMatrix\";\n\nfunction RightRow({\n right: r,\n readOnly,\n query,\n hasOrigin,\n originText,\n names,\n universal,\n flashed,\n onToggle,\n}: {\n right: Right;\n readOnly: boolean;\n query: string;\n hasOrigin: boolean;\n originText: Record<Origin, string>;\n names: Map<string, string>;\n universal: ReadonlySet<string>;\n flashed: boolean;\n onToggle: (granted: boolean) => void;\n}) {\n const t = useUiText();\n const descId = useId();\n const nameId = useId();\n const name = r.label ?? r.code;\n const needs = readOnly ? [] : (r.requires ?? []).filter((c) => !universal.has(c)).map((c) => names.get(c) ?? c);\n const text: ReactNode = (\n <span className=\"flex min-w-0 flex-1 flex-col gap-2\">\n <span className=\"flex min-w-0 items-start gap-8\">\n <span\n id={nameId}\n className={cn(\n \"min-w-0 wrap-break-word\",\n r.label ? \"text-body font-medium\" : \"mono text-small\",\n readOnly && !r.granted ? \"text-fg-tertiary\" : \"text-fg\",\n )}\n >\n <Highlight text={name} query={query} />\n </span>\n {r.label && (\n <span className=\"hidden h-20 min-w-0 items-center @auth:flex\">\n <span className=\"min-w-0 truncate mono text-caption text-fg-tertiary\">{r.code}</span>\n </span>\n )}\n {r.sensitive && (\n <span className={cn(\"flex shrink-0 items-center\", r.label ? \"h-20\" : \"h-18\")}>\n <Tooltip content={t(\"rightsMatrix.sensitiveHint\", \"Sensitive: exposes data or is hard to undo\")}>\n <span tabIndex={0} className=\"inline-flex shrink-0 rounded-pill text-warning-text focus-ring\">\n <Icon icon={__icon_Alert02Icon} size=\"sm\" label={t(\"rightsMatrix.sensitive\", \"Sensitive\")} />\n </span>\n </Tooltip>\n </span>\n )}\n {hasOrigin && !readOnly && (\n <span\n className={cn(\n \"ml-auto flex w-80 shrink-0 items-center justify-end text-right text-small\",\n r.label ? \"h-20\" : \"h-18\",\n KAESO_RIGHTS_MATRIX_VARIANTS.origin[r.origin ?? \"none\"].classes,\n )}\n >\n {originText[r.origin ?? \"none\"]}\n </span>\n )}\n </span>\n <span id={descId} className={cn(\"text-small text-pretty\", readOnly && !r.granted ? \"text-fg-tertiary\" : \"text-fg-secondary\")}>\n {r.description}\n </span>\n {needs.length > 0 && (\n <span className=\"text-caption text-fg-tertiary\">\n {t(\"rightsMatrix.needs\", \"Needs {rights}\", { rights: needs.join(t(\"rightsMatrix.listSeparator\", \", \")) })}\n </span>\n )}\n {readOnly && r.granted && !!r.sources?.length && (\n <span className=\"flex flex-wrap gap-4 pt-4\">\n {r.sources.map((s) =>\n s.detail ? (\n <Tooltip key={s.label} content={s.detail}>\n <Badge tabIndex={0} className=\"focus-ring\">\n {s.label}\n </Badge>\n </Tooltip>\n ) : (\n <Badge key={s.label}>{s.label}</Badge>\n ),\n )}\n </span>\n )}\n </span>\n );\n\n if (readOnly) {\n return (\n <div className=\"flex min-h-52 items-start gap-12 px-12 py-8\">\n <span className=\"flex h-20 w-18 shrink-0 items-center justify-center\">\n <Icon\n icon={r.granted ? __icon_Tick02Icon : __icon_MinusSignIcon}\n size=\"sm\"\n className={r.granted ? \"text-fg\" : \"text-fg-disabled\"}\n label={r.granted ? t(\"rightsMatrix.granted\", \"Granted\") : t(\"rightsMatrix.notGranted\", \"Not granted\")}\n />\n </span>\n {text}\n </div>\n );\n }\n\n const row = (\n <label\n className={cn(\n \"flex min-h-52 cursor-pointer items-start gap-12 rounded-item px-12 py-8 transition-control hover:bg-fill-1\",\n flashed && \"bg-fill-2 hover:bg-fill-2\",\n r.disabled && \"cursor-not-allowed\",\n )}\n >\n <span className=\"flex h-20 items-center\">\n <CheckboxBox checked={r.granted} disabled={r.disabled} onCheckedChange={onToggle} aria-labelledby={nameId} aria-describedby={descId} />\n </span>\n {text}\n </label>\n );\n return r.disabled && r.disabledReason ? <Tooltip content={r.disabledReason}>{row}</Tooltip> : row;\n}\n"],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  import { t as e } from "./cn-DUDmdLpZ.js";
3
3
  import { t } from "./use-controllable-B5Fd12Bx.js";
4
4
  import { t as n } from "./icon-BqujXDUc.js";
5
- import { r } from "./tooltip-S1DmyLVl.js";
5
+ import { r } from "./tooltip-CTBnfiDH.js";
6
6
  import { t as i } from "./observe-resize-DhxhmoyB.js";
7
7
  import { forwardRef as a, useEffect as o, useLayoutEffect as s, useRef as c, useState as l } from "react";
8
8
  import { jsx as u, jsxs as d } from "react/jsx-runtime";
@@ -93,7 +93,7 @@ var h = { size: {
93
93
  let i = t.icon && !t.label, a = /* @__PURE__ */ d(f.Root, {
94
94
  value: t.value,
95
95
  ...t.disabled ? { disabled: !0 } : {},
96
- ...t["aria-label"] ? { "aria-label": t["aria-label"] } : {},
96
+ ...i && t["aria-label"] ? { "aria-label": t["aria-label"] } : {},
97
97
  className: e("relative inline-flex cursor-pointer items-center justify-center gap-6 rounded-pill font-medium whitespace-nowrap text-fg-secondary transition-control focus-ring tap-target", "hover:text-fg checked:text-fg disabled:cursor-not-allowed disabled:text-fg-disabled", _[l], i && v[l], y && "flex-1"),
98
98
  children: [t.icon && /* @__PURE__ */ u(n, {
99
99
  icon: t.icon,
@@ -111,4 +111,4 @@ process.env.NODE_ENV !== "production" && (y.displayName = "Segmented");
111
111
  //#endregion
112
112
  export { h as n, y as r, g as t };
113
113
 
114
- //# sourceMappingURL=segmented-DXKVF-nY.js.map
114
+ //# sourceMappingURL=segmented-DxjnIuww.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"segmented-DXKVF-nY.js","names":["BaseRadioGroup","BaseRadio","cn","Icon","observeResize","useIndicator","box","setBox","useState","animate","setAnimate","useEffect","raf","live","useLayoutEffect","root","container","measure","el","selector","b","stop","layout","KAESO_SEGMENTED_VARIANTS","KAESO_SEGMENTED_DEFAULT_VARIANTS","ITEM","ITEM_ICON","Segmented","ariaLabel","force","current","setCurrent","useControllable","value","defaultValue","options","onValueChange","track","useRef","ind","size","RadioGroup","ref","v","disabled","fullWidth","className","iconOnly","o","item","Radio","Tooltip"],"sources":["../../src/hooks/use-indicator.ts","../../src/components/segmented/segmented.tsx"],"sourcesContent":["import { useEffect, useLayoutEffect, useState, type RefObject } from \"react\";\nimport { observeResize } from \"../utils/observe-resize.js\";\n\nexport function useIndicator(\n container: RefObject<HTMLElement | null>,\n selector: string,\n layout: string,\n): { x: number; y: number; w: number; h: number; ready: boolean; animate: boolean } {\n const [box, setBox] = useState({ x: 0, y: 0, w: 0, h: 0, ready: false });\n const [animate, setAnimate] = useState(false);\n useEffect(() => {\n if (!box.ready || animate) return;\n let raf = 0;\n let live = true;\n void (document.fonts?.ready ?? Promise.resolve()).then(() => {\n if (live) raf = requestAnimationFrame(() => (raf = requestAnimationFrame(() => setAnimate(true))));\n });\n return () => {\n live = false;\n cancelAnimationFrame(raf);\n };\n }, [box.ready, animate]);\n useLayoutEffect(() => {\n const root = container.current;\n if (!root) return;\n const measure = () => {\n const el = root.querySelector<HTMLElement>(selector);\n if (!el) return setBox((b) => ({ ...b, ready: false }));\n setBox({ x: Math.round(el.offsetLeft), y: Math.round(el.offsetTop), w: Math.round(el.offsetWidth), h: Math.round(el.offsetHeight), ready: true });\n };\n measure();\n if (typeof ResizeObserver === \"undefined\") return;\n let live = true;\n const stop = observeResize([root, ...root.querySelectorAll(\":scope > *\")], measure);\n void document.fonts?.ready.then(() => {\n if (live) measure();\n });\n return () => {\n live = false;\n stop();\n };\n }, [container, selector, layout]);\n return { ...box, animate };\n}\n","import { forwardRef, useRef, type ReactNode } from \"react\";\nimport { RadioGroup as BaseRadioGroup } from \"@base-ui/react/radio-group\";\nimport { Radio as BaseRadio } from \"@base-ui/react/radio\";\nimport { cn } from \"../../utils/cn.js\";\nimport { useControllable } from \"../../utils/use-controllable.js\";\nimport { useIndicator } from \"../../hooks/use-indicator.js\";\nimport { Icon, type IconData } from \"../icon/icon.js\";\nimport { Tooltip } from \"../tooltip/tooltip.js\";\n\nexport const KAESO_SEGMENTED_VARIANTS = {\n size: {\n sm: { classes: \"h-32 p-2 gap-2\" },\n md: { classes: \"h-36 p-2 gap-2\" },\n },\n} as const;\nexport const KAESO_SEGMENTED_DEFAULT_VARIANTS = { size: \"md\" } as const;\n\nconst ITEM = { sm: \"h-28 px-10 text-body\", md: \"h-32 px-12 text-body\" } as const;\nconst ITEM_ICON = { sm: \"w-32 px-0\", md: \"w-36 px-0\" } as const;\n\nexport interface SegmentedOption {\n value: string;\n label?: ReactNode | undefined;\n icon?: IconData | undefined;\n \"aria-label\"?: string | undefined;\n disabled?: boolean | undefined;\n}\n\nexport interface SegmentedProps {\n options: SegmentedOption[];\n value?: string | undefined;\n defaultValue?: string | undefined;\n onValueChange?: ((value: string) => void) | undefined;\n size?: keyof typeof KAESO_SEGMENTED_VARIANTS.size | undefined;\n disabled?: boolean | undefined;\n fullWidth?: boolean | undefined;\n \"aria-label\": string;\n className?: string | undefined;\n \"data-force\"?: string | undefined;\n}\n\nexport const Segmented = /* @__PURE__ */ forwardRef<HTMLDivElement, SegmentedProps>(function Segmented(\n { options, value, defaultValue, onValueChange, size = \"md\", disabled, fullWidth, className, \"aria-label\": ariaLabel, \"data-force\": force },\n ref,\n) {\n const [current, setCurrent] = useControllable(value, defaultValue ?? options[0]?.value ?? \"\", onValueChange);\n const track = useRef<HTMLDivElement | null>(null);\n const ind = useIndicator(track, \"[data-checked]\", `${current}|${options.length}|${size}`);\n return (\n <BaseRadioGroup\n ref={(el: HTMLDivElement | null) => {\n track.current = el;\n if (typeof ref === \"function\") ref(el);\n else if (ref) ref.current = el;\n }}\n value={current}\n onValueChange={(v: unknown) => setCurrent(String(v))}\n {...(disabled !== undefined ? { disabled } : {})}\n aria-label={ariaLabel}\n {...(force ? { \"data-force\": force } : {})}\n className={cn(\n \"relative isolate inline-flex items-center rounded-pill bg-fill-1\",\n KAESO_SEGMENTED_VARIANTS.size[size].classes,\n fullWidth && \"flex w-full\",\n disabled && \"opacity-40\",\n className,\n )}\n >\n <span\n aria-hidden\n className={cn(\"absolute top-0 left-0 -z-10 rounded-pill bg-raised shadow-segment\", ind.animate && \"indicator-motion\", !ind.ready && \"opacity-0\")}\n style={{ transform: `translate(${ind.x}px, ${ind.y}px)`, width: ind.w, height: ind.h }}\n />\n {options.map((o) => {\n const iconOnly = o.icon && !o.label;\n const item = (\n <BaseRadio.Root\n key={o.value}\n value={o.value}\n {...(o.disabled ? { disabled: true } : {})}\n {...(o[\"aria-label\"] ? { \"aria-label\": o[\"aria-label\"] } : {})}\n className={cn(\n \"relative inline-flex cursor-pointer items-center justify-center gap-6 rounded-pill font-medium whitespace-nowrap text-fg-secondary transition-control focus-ring tap-target\",\n \"hover:text-fg checked:text-fg disabled:cursor-not-allowed disabled:text-fg-disabled\",\n ITEM[size],\n iconOnly && ITEM_ICON[size],\n fullWidth && \"flex-1\",\n )}\n >\n {o.icon && <Icon icon={o.icon} size=\"sm\" />}\n {o.label}\n </BaseRadio.Root>\n );\n return iconOnly && o[\"aria-label\"] ? (\n <Tooltip key={o.value} content={o[\"aria-label\"]}>\n {item}\n </Tooltip>\n ) : (\n item\n );\n })}\n </BaseRadioGroup>\n );\n});\nif (process.env.NODE_ENV !== \"production\") Segmented.displayName = \"Segmented\";\n"],"mappings":"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"}
1
+ {"version":3,"file":"segmented-DxjnIuww.js","names":["BaseRadioGroup","BaseRadio","cn","Icon","observeResize","useIndicator","box","setBox","useState","animate","setAnimate","useEffect","raf","live","useLayoutEffect","root","container","measure","el","selector","b","stop","layout","KAESO_SEGMENTED_VARIANTS","KAESO_SEGMENTED_DEFAULT_VARIANTS","ITEM","ITEM_ICON","Segmented","ariaLabel","force","current","setCurrent","useControllable","value","defaultValue","options","onValueChange","track","useRef","ind","size","RadioGroup","ref","v","disabled","fullWidth","className","iconOnly","o","item","Radio","Tooltip"],"sources":["../../src/hooks/use-indicator.ts","../../src/components/segmented/segmented.tsx"],"sourcesContent":["import { useEffect, useLayoutEffect, useState, type RefObject } from \"react\";\nimport { observeResize } from \"../utils/observe-resize.js\";\n\nexport function useIndicator(\n container: RefObject<HTMLElement | null>,\n selector: string,\n layout: string,\n): { x: number; y: number; w: number; h: number; ready: boolean; animate: boolean } {\n const [box, setBox] = useState({ x: 0, y: 0, w: 0, h: 0, ready: false });\n const [animate, setAnimate] = useState(false);\n useEffect(() => {\n if (!box.ready || animate) return;\n let raf = 0;\n let live = true;\n void (document.fonts?.ready ?? Promise.resolve()).then(() => {\n if (live) raf = requestAnimationFrame(() => (raf = requestAnimationFrame(() => setAnimate(true))));\n });\n return () => {\n live = false;\n cancelAnimationFrame(raf);\n };\n }, [box.ready, animate]);\n useLayoutEffect(() => {\n const root = container.current;\n if (!root) return;\n const measure = () => {\n const el = root.querySelector<HTMLElement>(selector);\n if (!el) return setBox((b) => ({ ...b, ready: false }));\n setBox({ x: Math.round(el.offsetLeft), y: Math.round(el.offsetTop), w: Math.round(el.offsetWidth), h: Math.round(el.offsetHeight), ready: true });\n };\n measure();\n if (typeof ResizeObserver === \"undefined\") return;\n let live = true;\n const stop = observeResize([root, ...root.querySelectorAll(\":scope > *\")], measure);\n void document.fonts?.ready.then(() => {\n if (live) measure();\n });\n return () => {\n live = false;\n stop();\n };\n }, [container, selector, layout]);\n return { ...box, animate };\n}\n","import { forwardRef, useRef, type ReactNode } from \"react\";\nimport { RadioGroup as BaseRadioGroup } from \"@base-ui/react/radio-group\";\nimport { Radio as BaseRadio } from \"@base-ui/react/radio\";\nimport { cn } from \"../../utils/cn.js\";\nimport { useControllable } from \"../../utils/use-controllable.js\";\nimport { useIndicator } from \"../../hooks/use-indicator.js\";\nimport { Icon, type IconData } from \"../icon/icon.js\";\nimport { Tooltip } from \"../tooltip/tooltip.js\";\n\nexport const KAESO_SEGMENTED_VARIANTS = {\n size: {\n sm: { classes: \"h-32 p-2 gap-2\" },\n md: { classes: \"h-36 p-2 gap-2\" },\n },\n} as const;\nexport const KAESO_SEGMENTED_DEFAULT_VARIANTS = { size: \"md\" } as const;\n\nconst ITEM = { sm: \"h-28 px-10 text-body\", md: \"h-32 px-12 text-body\" } as const;\nconst ITEM_ICON = { sm: \"w-32 px-0\", md: \"w-36 px-0\" } as const;\n\nexport interface SegmentedOption {\n value: string;\n label?: ReactNode | undefined;\n icon?: IconData | undefined;\n \"aria-label\"?: string | undefined;\n disabled?: boolean | undefined;\n}\n\nexport interface SegmentedProps {\n options: SegmentedOption[];\n value?: string | undefined;\n defaultValue?: string | undefined;\n onValueChange?: ((value: string) => void) | undefined;\n size?: keyof typeof KAESO_SEGMENTED_VARIANTS.size | undefined;\n disabled?: boolean | undefined;\n fullWidth?: boolean | undefined;\n \"aria-label\": string;\n className?: string | undefined;\n \"data-force\"?: string | undefined;\n}\n\nexport const Segmented = /* @__PURE__ */ forwardRef<HTMLDivElement, SegmentedProps>(function Segmented(\n { options, value, defaultValue, onValueChange, size = \"md\", disabled, fullWidth, className, \"aria-label\": ariaLabel, \"data-force\": force },\n ref,\n) {\n const [current, setCurrent] = useControllable(value, defaultValue ?? options[0]?.value ?? \"\", onValueChange);\n const track = useRef<HTMLDivElement | null>(null);\n const ind = useIndicator(track, \"[data-checked]\", `${current}|${options.length}|${size}`);\n return (\n <BaseRadioGroup\n ref={(el: HTMLDivElement | null) => {\n track.current = el;\n if (typeof ref === \"function\") ref(el);\n else if (ref) ref.current = el;\n }}\n value={current}\n onValueChange={(v: unknown) => setCurrent(String(v))}\n {...(disabled !== undefined ? { disabled } : {})}\n aria-label={ariaLabel}\n {...(force ? { \"data-force\": force } : {})}\n className={cn(\n \"relative isolate inline-flex items-center rounded-pill bg-fill-1\",\n KAESO_SEGMENTED_VARIANTS.size[size].classes,\n fullWidth && \"flex w-full\",\n disabled && \"opacity-40\",\n className,\n )}\n >\n <span\n aria-hidden\n className={cn(\"absolute top-0 left-0 -z-10 rounded-pill bg-raised shadow-segment\", ind.animate && \"indicator-motion\", !ind.ready && \"opacity-0\")}\n style={{ transform: `translate(${ind.x}px, ${ind.y}px)`, width: ind.w, height: ind.h }}\n />\n {options.map((o) => {\n const iconOnly = o.icon && !o.label;\n const item = (\n <BaseRadio.Root\n key={o.value}\n value={o.value}\n {...(o.disabled ? { disabled: true } : {})}\n {...(iconOnly && o[\"aria-label\"] ? { \"aria-label\": o[\"aria-label\"] } : {})}\n className={cn(\n \"relative inline-flex cursor-pointer items-center justify-center gap-6 rounded-pill font-medium whitespace-nowrap text-fg-secondary transition-control focus-ring tap-target\",\n \"hover:text-fg checked:text-fg disabled:cursor-not-allowed disabled:text-fg-disabled\",\n ITEM[size],\n iconOnly && ITEM_ICON[size],\n fullWidth && \"flex-1\",\n )}\n >\n {o.icon && <Icon icon={o.icon} size=\"sm\" />}\n {o.label}\n </BaseRadio.Root>\n );\n return iconOnly && o[\"aria-label\"] ? (\n <Tooltip key={o.value} content={o[\"aria-label\"]}>\n {item}\n </Tooltip>\n ) : (\n item\n );\n })}\n </BaseRadioGroup>\n );\n});\nif (process.env.NODE_ENV !== \"production\") Segmented.displayName = \"Segmented\";\n"],"mappings":"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"}