@logicplanes/kaeso-ui 0.4.6 → 0.4.8

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 (154) hide show
  1. package/NOTICE.md +1 -1
  2. package/ai/component-guides.md +36 -2
  3. package/ai/component-registry.json +67 -5
  4. package/ai/component-registry.md +23 -5
  5. package/ai/icons.md +1 -1
  6. package/ai/tokens.md +1 -1
  7. package/dist/blocks/delete-resource.js +1 -1
  8. package/dist/blocks/pages.js +2 -2
  9. package/dist/blocks/resource-list.js +3 -3
  10. package/dist/chunks/{app-frame-DysOel2X.js → app-frame-D8sGcD0v.js} +6 -6
  11. package/dist/chunks/{app-frame-DysOel2X.js.map → app-frame-D8sGcD0v.js.map} +1 -1
  12. package/dist/chunks/{banner-B3DGLTBu.js → banner-BinTH032.js} +2 -2
  13. package/dist/chunks/{banner-B3DGLTBu.js.map → banner-BinTH032.js.map} +1 -1
  14. package/dist/chunks/{button-IblhXUyZ.js → button-DrmFgdIi.js} +2 -2
  15. package/dist/chunks/button-DrmFgdIi.js.map +1 -0
  16. package/dist/chunks/{checkbox-9tbimmF3.js → checkbox-ahl1SOqU.js} +2 -2
  17. package/dist/chunks/{checkbox-9tbimmF3.js.map → checkbox-ahl1SOqU.js.map} +1 -1
  18. package/dist/chunks/{code-block-KIvuE8jg.js → code-block-CE3H3nMu.js} +3 -3
  19. package/dist/chunks/{code-block-KIvuE8jg.js.map → code-block-CE3H3nMu.js.map} +1 -1
  20. package/dist/chunks/{code-block-64e-Cy1S.js → code-block-O_EPmMIQ.js} +2 -2
  21. package/dist/chunks/{code-block-64e-Cy1S.js.map → code-block-O_EPmMIQ.js.map} +1 -1
  22. package/dist/chunks/{combobox-DkcjkWc6.js → combobox-DghYPLVQ.js} +7 -3
  23. package/dist/chunks/combobox-DghYPLVQ.js.map +1 -0
  24. package/dist/chunks/{command-list-CypqsC4T.js → command-list-BUmEaaBi.js} +3 -3
  25. package/dist/chunks/{command-list-CypqsC4T.js.map → command-list-BUmEaaBi.js.map} +1 -1
  26. package/dist/chunks/{copy-button-CwU8t_9_.js → copy-button-DBPAA1g0.js} +2 -2
  27. package/dist/chunks/{copy-button-CwU8t_9_.js.map → copy-button-DBPAA1g0.js.map} +1 -1
  28. package/dist/chunks/{core-CmK-8ObW.js → core-Cw3pNRp3.js} +10 -9
  29. package/dist/chunks/core-Cw3pNRp3.js.map +1 -0
  30. package/dist/chunks/data-table-CGecI-FI.js +602 -0
  31. package/dist/chunks/data-table-CGecI-FI.js.map +1 -0
  32. package/dist/chunks/{date-popup-DAnjptFt.js → date-popup-C6vVOOWF.js} +2 -2
  33. package/dist/chunks/{date-popup-DAnjptFt.js.map → date-popup-C6vVOOWF.js.map} +1 -1
  34. package/dist/chunks/{dialog-2zb6ClNR.js → dialog-s3_LUPBi.js} +4 -4
  35. package/dist/chunks/{dialog-2zb6ClNR.js.map → dialog-s3_LUPBi.js.map} +1 -1
  36. package/dist/chunks/{domain-obd_w9xk.js → domain-CrQX3p6E.js} +2 -2
  37. package/dist/chunks/{domain-obd_w9xk.js.map → domain-CrQX3p6E.js.map} +1 -1
  38. package/dist/chunks/{icon-button-Dfwpvmav.js → icon-button-6kOn2zrP.js} +2 -2
  39. package/dist/chunks/{icon-button-Dfwpvmav.js.map → icon-button-6kOn2zrP.js.map} +1 -1
  40. package/dist/chunks/identity-BwYixi8Q.js +520 -0
  41. package/dist/chunks/identity-BwYixi8Q.js.map +1 -0
  42. package/dist/chunks/{input-Bo5-UZg2.js → input-D1SeLe3X.js} +2 -2
  43. package/dist/chunks/{input-Bo5-UZg2.js.map → input-D1SeLe3X.js.map} +1 -1
  44. package/dist/chunks/{input-group-jPcK9T_a.js → input-group-BbxwEAUP.js} +2 -2
  45. package/dist/chunks/{input-group-jPcK9T_a.js.map → input-group-BbxwEAUP.js.map} +1 -1
  46. package/dist/chunks/{iso-field-DoqHBg8n.js → iso-field-BVOKAY4H.js} +2 -2
  47. package/dist/chunks/{iso-field-DoqHBg8n.js.map → iso-field-BVOKAY4H.js.map} +1 -1
  48. package/dist/chunks/{list-B4G-sWwV.js → list-o8wcuBOz.js} +117 -94
  49. package/dist/chunks/list-o8wcuBOz.js.map +1 -0
  50. package/dist/chunks/{markdown-C565aBR7.js → markdown-BZKZi9d8.js} +4 -4
  51. package/dist/chunks/{markdown-C565aBR7.js.map → markdown-BZKZi9d8.js.map} +1 -1
  52. package/dist/chunks/{menu-Clvv6ftq.js → menu-BDce2kiw.js} +2 -2
  53. package/dist/chunks/{menu-Clvv6ftq.js.map → menu-BDce2kiw.js.map} +1 -1
  54. package/dist/chunks/{nav-sheet-Dt6JSvzX.js → nav-sheet-D3U7MeaI.js} +3 -3
  55. package/dist/chunks/{nav-sheet-Dt6JSvzX.js.map → nav-sheet-D3U7MeaI.js.map} +1 -1
  56. package/dist/chunks/{page-header-kS5tdmvb.js → page-header-C5Bv1gKE.js} +2 -2
  57. package/dist/chunks/{page-header-kS5tdmvb.js.map → page-header-C5Bv1gKE.js.map} +1 -1
  58. package/dist/chunks/{pagination-D7fAm8qg.js → pagination-D9hM6W2z.js} +3 -3
  59. package/dist/chunks/{pagination-D7fAm8qg.js.map → pagination-D9hM6W2z.js.map} +1 -1
  60. package/dist/chunks/{picker-popover-1FHb1LQG.js → picker-popover-PzVOo62-.js} +4 -4
  61. package/dist/chunks/{picker-popover-1FHb1LQG.js.map → picker-popover-PzVOo62-.js.map} +1 -1
  62. package/dist/chunks/{range-popup-lGiZsG3s.js → range-popup-Dt6Q0Ryw.js} +3 -3
  63. package/dist/chunks/{range-popup-lGiZsG3s.js.map → range-popup-Dt6Q0Ryw.js.map} +1 -1
  64. package/dist/chunks/{rights-B68ocZuq.js → rights-DAHTG_kH.js} +4 -4
  65. package/dist/chunks/{rights-B68ocZuq.js.map → rights-DAHTG_kH.js.map} +1 -1
  66. package/dist/chunks/{select-BqjmQOqx.js → select-UTdHKubp.js} +2 -2
  67. package/dist/chunks/{select-BqjmQOqx.js.map → select-UTdHKubp.js.map} +1 -1
  68. package/dist/chunks/{sidebar-Dq7oGOje.js → sidebar-K30Ae8N5.js} +2 -2
  69. package/dist/chunks/{sidebar-Dq7oGOje.js.map → sidebar-K30Ae8N5.js.map} +1 -1
  70. package/dist/chunks/{sidebar-menu-QSSNu1jJ.js → sidebar-menu-C0qJsQF5.js} +2 -2
  71. package/dist/chunks/{sidebar-menu-QSSNu1jJ.js.map → sidebar-menu-C0qJsQF5.js.map} +1 -1
  72. package/dist/chunks/styles-8fn_bHRP.js +21 -0
  73. package/dist/chunks/styles-8fn_bHRP.js.map +1 -0
  74. package/dist/chunks/{textarea-CO0HP6fK.js → textarea-CRmvC4jd.js} +3 -3
  75. package/dist/chunks/{textarea-CO0HP6fK.js.map → textarea-CRmvC4jd.js.map} +1 -1
  76. package/dist/chunks/{theme-provider-DJhORMlc.js → theme-provider-BjXTggqM.js} +6 -2
  77. package/dist/chunks/theme-provider-BjXTggqM.js.map +1 -0
  78. package/dist/chunks/{timeseries-Ck-q0wWn.js → timeseries-CK86u7M0.js} +3 -3
  79. package/dist/chunks/{timeseries-Ck-q0wWn.js.map → timeseries-CK86u7M0.js.map} +1 -1
  80. package/dist/components/app-frame.js +2 -2
  81. package/dist/components/banner.js +1 -1
  82. package/dist/components/button-group.js +1 -1
  83. package/dist/components/button.js +1 -1
  84. package/dist/components/charts/bar.js +2 -2
  85. package/dist/components/charts/donut.js +1 -1
  86. package/dist/components/charts/gauge.js +1 -1
  87. package/dist/components/charts/heatmap.js +1 -1
  88. package/dist/components/charts/sankey.js +2 -2
  89. package/dist/components/charts/timeseries.js +1 -1
  90. package/dist/components/charts.js +2 -2
  91. package/dist/components/checkbox.js +1 -1
  92. package/dist/components/code-block.js +2 -2
  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 +1 -1
  98. package/dist/components/date-picker.js +2 -2
  99. package/dist/components/dialog.js +2 -2
  100. package/dist/components/display-options.js +2 -2
  101. package/dist/components/filter-chip.js +3 -3
  102. package/dist/components/filter-toggle.js +35 -0
  103. package/dist/components/filter-toggle.js.map +1 -0
  104. package/dist/components/icon-button.js +1 -1
  105. package/dist/components/input.js +3 -3
  106. package/dist/components/kaeso/conversation.js +2 -2
  107. package/dist/components/kaeso/identity.js +1 -1
  108. package/dist/components/kaeso/moments.js +3 -3
  109. package/dist/components/kaeso/rights.js +1 -1
  110. package/dist/components/kaeso/usage.js +1 -1
  111. package/dist/components/kaeso.js +11 -16
  112. package/dist/components/kaeso.js.map +1 -1
  113. package/dist/components/key-value.js +1 -1
  114. package/dist/components/list.js +1 -1
  115. package/dist/components/markdown.js +1 -1
  116. package/dist/components/menu.js +2 -2
  117. package/dist/components/page-header.js +1 -1
  118. package/dist/components/pagination.js +1 -1
  119. package/dist/components/playground.js +9 -9
  120. package/dist/components/select.js +1 -1
  121. package/dist/components/sheet.js +1 -1
  122. package/dist/components/sidebar.js +1 -1
  123. package/dist/components/tabs.js +4 -4
  124. package/dist/components/tabs.js.map +1 -1
  125. package/dist/components/theme-menu.js +3 -3
  126. package/dist/components/theme-select.js +2 -2
  127. package/dist/components/toast.js +40 -38
  128. package/dist/components/toast.js.map +1 -1
  129. package/dist/index.js +69 -68
  130. package/dist/kaeso.css +19 -12
  131. package/dist/styles.css +1 -1
  132. package/dist/theme.js +1 -1
  133. package/dist/types/components/combobox/combobox.d.ts +2 -0
  134. package/dist/types/components/filter-toggle/docs.d.ts +11 -0
  135. package/dist/types/components/filter-toggle/filter-toggle.d.ts +23 -0
  136. package/dist/types/components/filter-toggle/index.d.ts +1 -0
  137. package/dist/types/components/kaeso/docs.d.ts +1 -0
  138. package/dist/types/components/kaeso/identity.d.ts +1 -0
  139. package/dist/types/components/kaeso/provider-marks.d.ts +27 -2
  140. package/dist/types/components/menu/styles.d.ts +1 -1
  141. package/dist/types/components/tabs/tabs.d.ts +2 -2
  142. package/dist/types/index.d.ts +1 -0
  143. package/package.json +5 -5
  144. package/dist/chunks/button-IblhXUyZ.js.map +0 -1
  145. package/dist/chunks/combobox-DkcjkWc6.js.map +0 -1
  146. package/dist/chunks/core-CmK-8ObW.js.map +0 -1
  147. package/dist/chunks/data-table-CqY8_6IS.js +0 -581
  148. package/dist/chunks/data-table-CqY8_6IS.js.map +0 -1
  149. package/dist/chunks/identity-3Foi5F8w.js +0 -361
  150. package/dist/chunks/identity-3Foi5F8w.js.map +0 -1
  151. package/dist/chunks/list-B4G-sWwV.js.map +0 -1
  152. package/dist/chunks/styles-hkFkoBbi.js +0 -21
  153. package/dist/chunks/styles-hkFkoBbi.js.map +0 -1
  154. package/dist/chunks/theme-provider-DJhORMlc.js.map +0 -1
package/dist/theme.js CHANGED
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- export { t as THEME_STORAGE_KEY, n as ThemeProvider, r as installFocusModality, i as themeScript, a as useTheme } from "./chunks/theme-provider-DJhORMlc.js";
2
+ export { t as THEME_STORAGE_KEY, n as ThemeProvider, r as installFocusModality, i as themeScript, a as useTheme } from "./chunks/theme-provider-BjXTggqM.js";
@@ -29,6 +29,8 @@ export interface ComboboxOption {
29
29
  value: string;
30
30
  label: string;
31
31
  description?: ReactNode | undefined;
32
+ /** A short value on the row's end, such as a time zone's offset. */
33
+ meta?: ReactNode | undefined;
32
34
  icon?: IconData | undefined;
33
35
  leading?: ReactNode | undefined;
34
36
  disabled?: boolean | undefined;
@@ -0,0 +1,11 @@
1
+ export declare const docs: {
2
+ FilterToggle: {
3
+ description: string;
4
+ props: {
5
+ label: string;
6
+ pressed: string;
7
+ onPressedChange: string;
8
+ size: string;
9
+ };
10
+ };
11
+ };
@@ -0,0 +1,23 @@
1
+ import { type ButtonHTMLAttributes, type ReactNode } from "react";
2
+ export declare const KAESO_FILTER_TOGGLE_VARIANTS: {
3
+ readonly size: {
4
+ readonly sm: {
5
+ readonly classes: "h-32 px-12 gap-6 text-body";
6
+ readonly description: "32px: beside small selects in toolbars and filter rows (default)";
7
+ };
8
+ readonly md: {
9
+ readonly classes: "h-36 px-16 gap-8 text-body";
10
+ readonly description: "36px: beside default selects";
11
+ };
12
+ };
13
+ };
14
+ export declare const KAESO_FILTER_TOGGLE_DEFAULT_VARIANTS: {
15
+ readonly size: "sm";
16
+ };
17
+ export interface FilterToggleProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, "children" | "onChange" | "type"> {
18
+ label: ReactNode;
19
+ pressed: boolean;
20
+ onPressedChange: (pressed: boolean) => void;
21
+ size?: keyof typeof KAESO_FILTER_TOGGLE_VARIANTS.size | undefined;
22
+ }
23
+ export declare const FilterToggle: import("react").ForwardRefExoticComponent<FilterToggleProps & import("react").RefAttributes<HTMLButtonElement>>;
@@ -0,0 +1 @@
1
+ export * from "./filter-toggle.js";
@@ -71,6 +71,7 @@ export declare const docs: {
71
71
  props: {
72
72
  capabilities: string;
73
73
  mark: string;
74
+ stacked: string;
74
75
  model: string;
75
76
  name: string;
76
77
  provider: string;
@@ -38,6 +38,7 @@ export interface ModelLabelProps {
38
38
  name?: string | undefined;
39
39
  capabilities?: Capability[] | undefined;
40
40
  mark?: boolean | undefined;
41
+ stacked?: boolean | undefined;
41
42
  className?: string | undefined;
42
43
  }
43
44
  export declare const ModelLabel: import("react").ForwardRefExoticComponent<ModelLabelProps & import("react").RefAttributes<HTMLSpanElement>>;
@@ -1,5 +1,30 @@
1
- export interface ProviderMark {
2
- d: string;
1
+ export interface ProviderMarkStop {
2
+ offset: number;
3
3
  color: string;
4
4
  }
5
+ export interface ProviderMarkGradient {
6
+ x1: number;
7
+ y1: number;
8
+ x2: number;
9
+ y2: number;
10
+ stops: readonly ProviderMarkStop[];
11
+ }
12
+ export type ProviderMarkPart = {
13
+ d: string;
14
+ color: string;
15
+ gradient?: undefined;
16
+ } | {
17
+ d: string;
18
+ gradient: ProviderMarkGradient;
19
+ color?: undefined;
20
+ };
21
+ export type ProviderMark = {
22
+ d: string;
23
+ color: string;
24
+ parts?: undefined;
25
+ } | {
26
+ parts: readonly ProviderMarkPart[];
27
+ d?: undefined;
28
+ color?: undefined;
29
+ };
5
30
  export declare const PROVIDER_MARKS: Record<string, ProviderMark>;
@@ -1,5 +1,5 @@
1
1
  export declare const MENU_POPUP = "z-50 flex min-w-220 max-w-360 flex-col overflow-y-auto overscroll-contain rounded-menu bg-raised p-6 text-body text-fg shadow-raised outline-none popup-motion scrollbar-quiet max-h-(--available-height)";
2
- export declare const MENU_ITEM = "group/item relative flex min-h-34 w-full cursor-default items-center gap-10 rounded-item px-10 text-left text-body font-medium text-fg outline-none select-none coarse:min-h-44 highlighted:bg-item-hover active:bg-item-pressed disabled:pointer-events-none disabled:text-fg-disabled";
2
+ export declare const MENU_ITEM = "group/item relative flex min-h-34 w-full shrink-0 cursor-default items-center gap-10 rounded-item px-10 text-left text-body font-medium text-fg outline-none select-none coarse:min-h-44 highlighted:bg-item-hover active:bg-item-pressed disabled:pointer-events-none disabled:text-fg-disabled";
3
3
  export declare const MENU_ICON = "text-fg-secondary group-data-highlighted/item:text-fg group-data-disabled/item:text-fg-disabled forced-colors:text-current";
4
4
  export declare const MENU_DANGER = "text-danger-text highlighted:bg-danger-tint active:bg-danger-tint";
5
5
  export declare const MENU_LABEL = "flex h-28 items-center px-10 text-caption font-medium text-fg-secondary";
@@ -4,7 +4,7 @@ export declare const KAESO_TABS_VARIANTS: {
4
4
  readonly variant: {
5
5
  readonly underline: {
6
6
  readonly classes: "";
7
- readonly description: "Underline tabs for detail pages: 40px, labels 12px in like every box, a 2px ink indicator under the label that slides";
7
+ readonly description: "Underline tabs for detail pages: 40px, the first label on the content edge like the heading above, 24px apart, a 2px ink indicator under the label that slides; hover previews the line";
8
8
  };
9
9
  readonly pill: {
10
10
  readonly classes: "";
@@ -19,7 +19,7 @@ export declare const KAESO_PILL_TABS_VARIANTS: {
19
19
  readonly variant: {
20
20
  readonly underline: {
21
21
  readonly classes: "";
22
- readonly description: "Underline tabs for detail pages: 40px, labels 12px in like every box, a 2px ink indicator under the label that slides";
22
+ readonly description: "Underline tabs for detail pages: 40px, the first label on the content edge like the heading above, 24px apart, a 2px ink indicator under the label that slides; hover previews the line";
23
23
  };
24
24
  readonly pill: {
25
25
  readonly classes: "";
@@ -48,6 +48,7 @@ export * from "./components/thumbnail/index.js";
48
48
  export * from "./components/calendar/index.js";
49
49
  export * from "./components/date-picker/index.js";
50
50
  export * from "./components/filter-chip/index.js";
51
+ export * from "./components/filter-toggle/index.js";
51
52
  export * from "./components/display-options/index.js";
52
53
  export * from "./components/dialog/index.js";
53
54
  export * from "./components/sheet/index.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@logicplanes/kaeso-ui",
3
- "version": "0.4.6",
3
+ "version": "0.4.8",
4
4
  "description": "Kaeso's UI library: React components on Base UI, Tailwind CSS v4 and the Kaeso tokens.",
5
5
  "license": "MIT",
6
6
  "author": "Devin Oldenburg",
@@ -90,7 +90,7 @@
90
90
  "dependencies": {
91
91
  "@base-ui/react": "1.9.0",
92
92
  "@tanstack/react-table": "8.21.3",
93
- "@tanstack/react-virtual": "3.14.21",
93
+ "@tanstack/react-virtual": "3.14.22",
94
94
  "clsx": "2.1.1",
95
95
  "d3-array": "3.2.4",
96
96
  "d3-sankey": "0.12.3",
@@ -102,7 +102,7 @@
102
102
  "shiki": "4.5.0",
103
103
  "tailwind-merge": "3.7.0",
104
104
  "uqr": "0.1.3",
105
- "@logicplanes/kaeso-tokens": "0.4.6"
105
+ "@logicplanes/kaeso-tokens": "0.4.8"
106
106
  },
107
107
  "devDependencies": {
108
108
  "@hugeicons/core-free-icons": "4.3.5",
@@ -125,14 +125,14 @@
125
125
  "@vitest/coverage-v8": "5.0.5",
126
126
  "axe-core": "4.14.0",
127
127
  "happy-dom": "21.0.4",
128
- "oxlint": "1.88.0",
128
+ "oxlint": "1.89.0",
129
129
  "react": "19.3.1",
130
130
  "react-docgen-typescript": "2.4.0",
131
131
  "react-dom": "19.3.1",
132
132
  "tailwindcss": "4.3.3",
133
133
  "tsx": "4.23.15",
134
134
  "typescript": "5.9.3",
135
- "vite": "8.3.4",
135
+ "vite": "8.3.5",
136
136
  "vitest": "5.0.5"
137
137
  },
138
138
  "scripts": {
@@ -1 +0,0 @@
1
- {"version":3,"file":"button-IblhXUyZ.js","names":["_Fragment","cn","warnStylingClassName","warnMissingName","isExternalHref","useLinkComponent","Icon","KbdSequence","Tooltip","useTruncated","useDelayedLoading","Spinner","SwapText","Fragment$1","KAESO_BUTTON_VARIANTS","KAESO_BUTTON_DEFAULT_VARIANTS","LEADING_ICON_PADDING","TRAILING_ICON_PADDING","CIRCLE","BUTTON_ICON_SIZE","ARIA_KEY","ariaKeyShortcuts","chord","keys","join","k","mod","buttonClasses","size","shape","leading","variant","trailing","fullWidth","Button","rest","props","LinkComp","focused","setFocused","useState","labelRef","useRef","className","spinning","loading","busy","isCircle","iconSize","spinnerSize","leadingIcon","trailingIcon","shortcut","count","reserveLabels","domProps","softDisabled","disabledReason","disabled","cut","describe","inert","classes","content","handleClick","onClick","handleFocus","onFocus","handleBlur","onBlur","el","href","external","target","rel","type","reasonShown"],"sources":["../../src/components/button/button.tsx"],"sourcesContent":["import { forwardRef, useRef, useState, type ButtonHTMLAttributes, type FocusEvent, type MouseEvent, type ReactElement, type ReactNode, type Ref } from \"react\";\nimport { cn } from \"../../utils/cn.js\";\nimport { useLinkComponent, isExternalHref } from \"../../utils/link-provider.js\";\nimport { warnMissingName, warnStylingClassName } from \"../../utils/dev.js\";\nimport { Icon, type IconData, type IconSize } from \"../icon/icon.js\";\nimport { Spinner, useDelayedLoading } from \"../loader/loader.js\";\nimport { KbdSequence } from \"../kbd/kbd.js\";\nimport { Tooltip } from \"../tooltip/tooltip.js\";\nimport { SwapText } from \"../swap-text/swap-text.js\";\nimport { useTruncated } from \"../../hooks/use-truncated.js\";\n\nexport const KAESO_BUTTON_VARIANTS = {\n variant: {\n primary: { classes: \"material-primary\" },\n secondary: { classes: \"material-secondary\" },\n ghost: { classes: \"material-ghost\" },\n quiet: {\n classes: \"material-ghost text-fg-secondary hover:text-fg active:text-fg open:text-fg\",\n },\n soft: { classes: \"material-soft\" },\n danger: { classes: \"material-danger\" },\n \"danger-secondary\": { classes: \"material-danger-secondary\" },\n link: {\n classes:\n \"bg-transparent text-fg underline decoration-fg-tertiary decoration-1 underline-offset-3 hover:decoration-current active:decoration-current open:decoration-current disabled:text-fg-disabled\",\n },\n },\n size: {\n xs: { classes: \"h-24 px-10 gap-4 text-caption font-medium ghost-end:-mr-10 ghost-start:-ml-10\" },\n sm: { classes: \"h-32 px-12 gap-6 text-body font-medium ghost-end:-mr-12 ghost-start:-ml-12\" },\n md: { classes: \"h-36 px-16 gap-6 text-body font-medium ghost-end:-mr-16 ghost-start:-ml-16\" },\n lg: { classes: \"h-40 px-18 gap-8 text-body font-medium ghost-end:-mr-18 ghost-start:-ml-18\" },\n xl: {\n classes: \"h-48 px-22 gap-8 text-body-lg font-medium ghost-end:-mr-22 ghost-start:-ml-22\",\n },\n },\n shape: {\n pill: { classes: \"rounded-pill\" },\n circle: { classes: \"rounded-pill p-0 justify-center ghost-end:mr-0 ghost-start:ml-0\" },\n },\n} as const;\nexport const KAESO_BUTTON_DEFAULT_VARIANTS = { variant: \"secondary\", size: \"md\", shape: \"pill\" } as const;\n\nexport type ButtonVariant = keyof typeof KAESO_BUTTON_VARIANTS.variant;\nexport type ButtonSize = keyof typeof KAESO_BUTTON_VARIANTS.size;\nexport type ButtonShape = keyof typeof KAESO_BUTTON_VARIANTS.shape;\n\nconst LEADING_ICON_PADDING: Record<ButtonSize, string> = { xs: \"pl-8\", sm: \"pl-10\", md: \"pl-14\", lg: \"pl-16\", xl: \"pl-20\" };\nconst TRAILING_ICON_PADDING: Record<ButtonSize, string> = { xs: \"pr-8\", sm: \"pr-10\", md: \"pr-14\", lg: \"pr-16\", xl: \"pr-20\" };\nconst CIRCLE: Record<ButtonSize, string> = { xs: \"size-24\", sm: \"size-32\", md: \"size-36\", lg: \"size-40\", xl: \"size-48\" };\nexport const BUTTON_ICON_SIZE: Record<ButtonSize, IconSize> = { xs: \"xs\", sm: \"sm\", md: \"sm\", lg: \"md\", xl: \"lg\" };\n\nconst ARIA_KEY: Record<string, string> = {\n cmd: \"Meta\",\n ctrl: \"Control\",\n alt: \"Alt\",\n option: \"Alt\",\n shift: \"Shift\",\n enter: \"Enter\",\n esc: \"Escape\",\n backspace: \"Backspace\",\n tab: \"Tab\",\n up: \"ArrowUp\",\n down: \"ArrowDown\",\n left: \"ArrowLeft\",\n right: \"ArrowRight\",\n};\n\n// aria-keyshortcuts lists chords only, so a sequence (\"G then L\") gets none; \"mod\" is offered as both platforms' chord.\nfunction ariaKeyShortcuts(keys: string[] | string[][]): string | undefined {\n const chord = (Array.isArray(keys[0]) ? (keys.length === 1 ? keys[0] : []) : keys) as string[];\n if (!chord.length) return undefined;\n const join = (mod: string) =>\n chord.map((k) => (k.toLowerCase() === \"mod\" ? mod : (ARIA_KEY[k.toLowerCase()] ?? (k.length === 1 ? k.toUpperCase() : k)))).join(\"+\");\n return chord.some((k) => k.toLowerCase() === \"mod\") ? `${join(\"Meta\")} ${join(\"Control\")}` : join(\"\");\n}\n\nexport function buttonClasses({\n variant = KAESO_BUTTON_DEFAULT_VARIANTS.variant,\n size = KAESO_BUTTON_DEFAULT_VARIANTS.size,\n shape = KAESO_BUTTON_DEFAULT_VARIANTS.shape,\n leading = false,\n trailing = false,\n fullWidth = false,\n}: {\n variant?: ButtonVariant | undefined;\n size?: ButtonSize | undefined;\n shape?: ButtonShape | undefined;\n leading?: boolean | undefined;\n trailing?: boolean | undefined;\n fullWidth?: boolean | undefined;\n} = {}) {\n return cn(\n \"relative inline-flex max-w-full shrink-0 select-none items-center justify-center whitespace-nowrap no-underline\",\n \"cursor-pointer transition-control focus-ring tap-target disabled:cursor-not-allowed\",\n KAESO_BUTTON_VARIANTS.size[size].classes,\n KAESO_BUTTON_VARIANTS.shape[shape].classes,\n shape === \"circle\" && CIRCLE[size],\n shape === \"pill\" && leading && variant !== \"link\" && LEADING_ICON_PADDING[size],\n shape === \"pill\" && trailing && variant !== \"link\" && TRAILING_ICON_PADDING[size],\n variant === \"link\" && \"-mx-2 h-auto rounded-code px-2 align-baseline outline-offset-0\",\n KAESO_BUTTON_VARIANTS.variant[variant].classes,\n fullWidth && \"w-full\",\n );\n}\n\ninterface CommonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"children\"> {\n variant?: ButtonVariant | undefined;\n size?: ButtonSize | undefined;\n loading?: boolean | undefined;\n disabledReason?: string | undefined;\n href?: string | undefined;\n target?: string | undefined;\n rel?: string | undefined;\n fullWidth?: boolean | undefined;\n \"data-force\"?: string | undefined;\n}\n\nexport interface PillButtonProps extends CommonProps {\n shape?: \"pill\" | undefined;\n children: ReactNode;\n leadingIcon?: IconData | undefined;\n trailingIcon?: IconData | undefined;\n shortcut?: string[] | string[][] | undefined;\n count?: number | undefined;\n reserveLabels?: ReactNode[] | undefined;\n}\n\nexport interface CircleButtonProps extends CommonProps {\n shape: \"circle\";\n icon: IconData;\n \"aria-label\": string;\n children?: never | undefined;\n}\n\nexport type ButtonProps = PillButtonProps | CircleButtonProps;\n\nexport const Button = /* @__PURE__ */ forwardRef<HTMLButtonElement | HTMLAnchorElement, ButtonProps>(function Button(props, ref) {\n const {\n variant = KAESO_BUTTON_DEFAULT_VARIANTS.variant,\n size = KAESO_BUTTON_DEFAULT_VARIANTS.size,\n loading = false,\n disabled = false,\n disabledReason,\n href,\n target,\n rel,\n fullWidth,\n className,\n type,\n onClick,\n onFocus,\n onBlur,\n ...rest\n } = props;\n const LinkComp = useLinkComponent();\n const [focused, setFocused] = useState(false);\n const labelRef = useRef<HTMLSpanElement>(null);\n warnStylingClassName(\"Button\", className);\n\n const spinning = useDelayedLoading(loading);\n const busy = loading || spinning;\n const isCircle = props.shape === \"circle\";\n const iconSize = BUTTON_ICON_SIZE[size];\n const spinnerSize = iconSize === \"xs\" ? \"xs\" : iconSize === \"sm\" ? \"sm\" : \"md\";\n const leadingIcon = !isCircle ? (props as PillButtonProps).leadingIcon : undefined;\n const trailingIcon = !isCircle ? (props as PillButtonProps).trailingIcon : undefined;\n const shortcut = !isCircle ? (props as PillButtonProps).shortcut : undefined;\n const count = !isCircle ? (props as PillButtonProps).count : undefined;\n const reserveLabels = !isCircle ? (props as PillButtonProps).reserveLabels : undefined;\n if (isCircle) warnMissingName(\"Button\", !!(props as CircleButtonProps)[\"aria-label\"]);\n\n const domProps = { ...rest } as Record<string, unknown>;\n for (const k of [\"shape\", \"icon\", \"leadingIcon\", \"trailingIcon\", \"shortcut\", \"count\", \"children\", \"reserveLabels\"]) delete domProps[k];\n\n // A natively disabled button that holds focus drops it to <body>; stay focusable until it blurs.\n const softDisabled = (!!disabledReason || focused) && disabled;\n const cut = useTruncated(labelRef, !isCircle);\n const describe = !!disabledReason && disabled && disabledReason !== (props as { \"aria-label\"?: string | undefined })[\"aria-label\"];\n const inert = busy || softDisabled;\n const classes = cn(\n buttonClasses({\n variant,\n size,\n shape: isCircle ? \"circle\" : \"pill\",\n leading: !!leadingIcon,\n trailing: !!trailingIcon || !!shortcut || count !== undefined,\n fullWidth: !!fullWidth,\n }),\n busy && \"cursor-progress\",\n size === \"xs\" && count !== undefined && !trailingIcon && !shortcut && \"pr-2\",\n className,\n );\n\n const content = isCircle ? (\n spinning ? (\n <Spinner size={spinnerSize} />\n ) : (\n <Icon icon={(props as CircleButtonProps).icon} size={iconSize} />\n )\n ) : (\n <>\n {spinning && leadingIcon ? <Spinner size={spinnerSize} /> : leadingIcon ? <Icon icon={leadingIcon} size={iconSize} /> : null}\n <span ref={labelRef} className={cn(\"min-w-0 truncate\", spinning && !leadingIcon && \"opacity-0\")}>\n {reserveLabels ? <SwapText reserve={reserveLabels}>{(props as PillButtonProps).children}</SwapText> : (props as PillButtonProps).children}\n </span>\n {count !== undefined && (\n <span\n className={cn(\n \"inline-flex h-20 min-w-20 items-center justify-center rounded-pill px-6 text-caption font-medium tabular\",\n variant === \"primary\" ? \"bg-on-ink/15 text-on-ink\" : variant === \"danger\" ? \"bg-on-danger/20 text-on-danger\" : \"bg-fill-2 text-fg-secondary\",\n )}\n >\n {count}\n </span>\n )}\n {shortcut && (\n <KbdSequence\n aria-hidden\n data-shortcut=\"\"\n keys={shortcut}\n tone={variant === \"primary\" || variant === \"danger\" ? \"onInk\" : \"default\"}\n className={cn(variant === \"danger\" && \"kbd-on-danger\")}\n />\n )}\n {trailingIcon && <Icon icon={trailingIcon} size={iconSize} />}\n {spinning && !leadingIcon && <Spinner size={spinnerSize} className=\"absolute inset-0 m-auto\" />}\n </>\n );\n\n const handleClick = (e: MouseEvent<HTMLButtonElement & HTMLAnchorElement>) => {\n if (inert) {\n e.preventDefault();\n return;\n }\n onClick?.(e as MouseEvent<HTMLButtonElement>);\n };\n\n const handleFocus = (e: FocusEvent<HTMLButtonElement & HTMLAnchorElement>) => {\n setFocused(true);\n onFocus?.(e as FocusEvent<HTMLButtonElement>);\n };\n const handleBlur = (e: FocusEvent<HTMLButtonElement & HTMLAnchorElement>) => {\n setFocused(false);\n onBlur?.(e as FocusEvent<HTMLButtonElement>);\n };\n\n let el: ReactNode;\n if (href && !disabled) {\n const external = isExternalHref(href);\n el = (\n <LinkComp\n ref={ref as Ref<HTMLAnchorElement>}\n href={href}\n className={classes}\n {...(target ? { target } : external ? { target: \"_blank\" } : {})}\n {...(rel ? { rel } : external ? { rel: \"noopener noreferrer\" } : {})}\n {...(domProps as object)}\n {...(shortcut ? { \"aria-keyshortcuts\": ariaKeyShortcuts(shortcut) } : {})}\n {...(busy ? { \"aria-busy\": true, \"data-loading\": \"\" } : {})}\n onClick={handleClick}\n onFocus={handleFocus}\n onBlur={handleBlur}\n >\n {content}\n </LinkComp>\n );\n } else {\n el = (\n <button\n ref={ref as Ref<HTMLButtonElement>}\n type={type ?? \"button\"}\n className={classes}\n disabled={disabled && !softDisabled}\n {...(domProps as object)}\n {...(shortcut ? { \"aria-keyshortcuts\": ariaKeyShortcuts(shortcut) } : {})}\n {...(softDisabled ? { \"aria-disabled\": true } : {})}\n {...(busy ? { \"aria-busy\": true, \"data-loading\": \"\" } : {})}\n {...(softDisabled ? { \"data-disabled\": \"\" } : {})}\n {...(describe ? { \"aria-description\": disabledReason } : {})}\n onClick={handleClick}\n onFocus={handleFocus}\n onBlur={handleBlur}\n >\n {content}\n </button>\n );\n }\n\n const reasonShown = !!disabledReason && !!disabled;\n // The Tooltip stays mounted when it has nothing to say: unwrapping would remount the button and drop its focus.\n return (\n <Tooltip content={reasonShown ? disabledReason : cut ? (props as PillButtonProps).children : \"\"} disabled={!reasonShown && !cut}>\n {el as ReactElement}\n </Tooltip>\n );\n});\nif (process.env.NODE_ENV !== \"production\") Button.displayName = \"Button\";\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"combobox-DkcjkWc6.js","names":["Combobox","BaseCombobox","_Fragment","__icon_Cancel01Icon","__icon_ArrowDown01Icon","__icon_Add01Icon","__icon_Tick02Icon","Autocomplete","BaseAutocomplete","MENU_ITEM","MENU_POPUP","MENU_ICON","cn","pageBoundary","usePortalContainer","useUiText","Icon","useField","useFieldControl","withField","LEADING","KAESO_INPUT_GROUP_VARIANTS","Tag","useLayoutWidth","anchorWidthStyle","Fragment$1","KAESO_COMBOBOX_VARIANTS","KAESO_COMBOBOX_DEFAULT_VARIANTS","Highlight","q","query","text","CHIPS","CHEVRON","keepValueOnEscape","Combobox$1","ariaLabel","force","props","className","t","field","fc","setQuery","useState","fieldRef","useRef","fieldWidth","inner","setInner","multiple","current","chosenKey","seen","byValue","useMemo","chosen","next","v","o","options","matched","list","onCreate","report","onInputValueChange","pending","timer","reportInput","searchDelay","rootValue","handleChange","arr","created","x","inputEl","Combobox","id","invalid","error","control","filtered","a","b","disabled","name","size","label","description","value","Cancel01Icon","ArrowDown01Icon","loading","emptyText","Add01Icon","createLabel","Tick02Icon","hidden","KAESO_AUTOCOMPLETE_VARIANTS","KAESO_AUTOCOMPLETE_DEFAULT_VARIANTS","Autocomplete$1","defaultValue","Autocomplete","suggestions","onValueChange","leadingIcon","s"],"sources":["../../src/components/combobox/combobox.tsx"],"sourcesContent":["import { pageBoundary, usePortalContainer } from \"../../utils/portal-context.js\";\nimport { forwardRef, useEffect, useMemo, useRef, useState, type KeyboardEvent, type ReactNode } from \"react\";\nimport { Combobox as BaseCombobox } from \"@base-ui/react/combobox\";\nimport { Autocomplete as BaseAutocomplete } from \"@base-ui/react/autocomplete\";\nimport { cn } from \"../../utils/cn.js\";\nimport { warnStylingClassName } from \"../../utils/dev.js\";\nimport { useField, useFieldControl, withField, type FieldWrapProps } from \"../field/field.js\";\nimport { Icon, type IconData } from \"../icon/icon.js\";\nimport { Cancel01Icon as __icon_Cancel01Icon, ArrowDown01Icon as __icon_ArrowDown01Icon, Add01Icon as __icon_Add01Icon, Tick02Icon as __icon_Tick02Icon } from \"@hugeicons/core-free-icons\";\nimport { KAESO_INPUT_GROUP_VARIANTS, LEADING, type InputSize } from \"../input/input-group.js\";\nimport { Tag } from \"../tag/tag.js\";\nimport { MENU_ICON, MENU_ITEM, MENU_POPUP } from \"../menu/styles.js\";\n\nimport { anchorWidthStyle, useLayoutWidth } from \"../../hooks/use-layout-width.js\";\nimport { useUiText } from \"../../i18n/context.js\";\n\nexport const KAESO_COMBOBOX_VARIANTS = {\n size: {\n sm: {\n classes: KAESO_INPUT_GROUP_VARIANTS.size.sm.classes,\n },\n md: {\n classes: KAESO_INPUT_GROUP_VARIANTS.size.md.classes,\n },\n lg: {\n classes: KAESO_INPUT_GROUP_VARIANTS.size.lg.classes,\n },\n xl: {\n classes: KAESO_INPUT_GROUP_VARIANTS.size.xl.classes,\n },\n },\n} as const;\nexport const KAESO_COMBOBOX_DEFAULT_VARIANTS = { size: \"md\" } as const;\n\nexport interface ComboboxOption {\n value: string;\n label: string;\n description?: ReactNode | undefined;\n icon?: IconData | undefined;\n leading?: ReactNode | undefined;\n disabled?: boolean | undefined;\n}\n\ninterface CreateItem extends ComboboxOption {\n __create: true;\n}\n\nexport interface HighlightProps {\n text: string;\n query: string;\n}\n\nexport const Highlight = /* @__PURE__ */ forwardRef<HTMLSpanElement, HighlightProps>(function Highlight({ text, query }, ref) {\n const q = query.trim().toLowerCase();\n if (!q) return <span ref={ref}>{text}</span>;\n const i = text.toLowerCase().indexOf(q);\n if (i < 0)\n return (\n <span ref={ref} className=\"text-fg-secondary group-data-disabled/item:text-fg-disabled\">\n {text}\n </span>\n );\n return (\n <span ref={ref} className=\"text-fg-secondary group-data-disabled/item:text-fg-disabled\">\n {text.slice(0, i)}\n <span className=\"text-fg group-data-disabled/item:text-fg-disabled\">{text.slice(i, i + q.length)}</span>\n {text.slice(i + q.length)}\n </span>\n );\n});\nif (process.env.NODE_ENV !== \"production\") Highlight.displayName = \"Highlight\";\n\ninterface BaseProps extends FieldWrapProps {\n options: ComboboxOption[];\n placeholder?: string | undefined;\n size?: InputSize | undefined;\n emptyText?: ReactNode | undefined;\n loading?: boolean | undefined;\n onInputValueChange?: ((value: string) => void) | undefined;\n searchDelay?: number | undefined;\n onCreate?: ((label: string) => void) | undefined;\n createLabel?: ((label: string) => string) | undefined;\n disabled?: boolean | undefined;\n invalid?: boolean | undefined;\n id?: string | undefined;\n name?: string | undefined;\n \"aria-label\"?: string | undefined;\n className?: string | undefined;\n \"data-force\"?: string | undefined;\n}\nexport interface SingleComboboxProps extends BaseProps {\n multiple?: false | undefined;\n value?: string | null | undefined;\n defaultValue?: string | null | undefined;\n onValueChange?: ((value: string | null) => void) | undefined;\n}\nexport interface MultiComboboxProps extends BaseProps {\n multiple: true;\n value?: string[] | undefined;\n defaultValue?: string[] | undefined;\n onValueChange?: ((value: string[]) => void) | undefined;\n}\nexport type ComboboxProps = SingleComboboxProps | MultiComboboxProps;\n\nconst CHIPS: Record<InputSize, { field: string; row: string; chevron: string }> = {\n sm: { field: \"min-h-32 p-4 pe-32\", row: \"h-24\", chevron: \"end-2 top-2\" },\n md: { field: \"min-h-36 p-4 pe-36\", row: \"h-28\", chevron: \"end-4 top-4\" },\n lg: { field: \"min-h-40 p-6 pe-36\", row: \"h-28\", chevron: \"end-6 top-6\" },\n xl: { field: \"min-h-48 p-8 pe-40 text-body-lg\", row: \"h-32\", chevron: \"end-10 top-10\" },\n};\n\nconst CHEVRON = \"inline-flex size-28 shrink-0 items-center justify-center rounded-pill text-fg-tertiary transition-control hover:bg-raised-hover hover:text-fg\";\n\nfunction keepValueOnEscape(e: KeyboardEvent<HTMLInputElement> & { preventBaseUIHandler?: (() => void) | undefined }) {\n if (e.key === \"Escape\" && e.currentTarget.getAttribute(\"aria-expanded\") !== \"true\") e.preventBaseUIHandler?.();\n}\n\nexport const Combobox = /* @__PURE__ */ forwardRef<HTMLInputElement, ComboboxProps>(function Combobox(props, ref) {\n const {\n options,\n placeholder,\n size = \"md\",\n emptyText,\n loading,\n onInputValueChange,\n searchDelay = 0,\n onCreate,\n createLabel,\n disabled,\n invalid,\n id,\n name,\n label,\n description,\n error,\n optional,\n required,\n layout,\n className,\n multiple,\n \"aria-label\": ariaLabel,\n \"data-force\": force,\n } = props;\n warnStylingClassName(\"Combobox\", className);\n const t = useUiText();\n const field = useField();\n const fc = useFieldControl(props);\n const [query, setQuery] = useState(\"\");\n const fieldRef = useRef<HTMLDivElement | null>(null);\n const fieldWidth = useLayoutWidth(fieldRef);\n const [inner, setInner] = useState<string | null | string[]>(() => props.defaultValue ?? (multiple ? [] : null));\n const current = props.value !== undefined ? props.value : inner;\n const chosenKey = (Array.isArray(current) ? current : current == null ? [] : [current]).join(\"\\u0000\");\n const seen = useRef(new Map<string, ComboboxOption>());\n const byValue = useMemo(() => {\n const chosen = new Set(chosenKey ? chosenKey.split(\"\\u0000\") : []);\n const next = new Map<string, ComboboxOption>();\n for (const [v, o] of seen.current) if (chosen.has(v)) next.set(v, o);\n for (const o of options) next.set(o.value, o);\n seen.current = next;\n return next;\n }, [options, chosenKey]);\n const { filtered, hidden } = useMemo(() => {\n const SHOWN_AT_MOST = 100;\n const q = query.trim().toLowerCase();\n const matched = q ? options.filter((o) => o.label.toLowerCase().includes(q) || o.value.toLowerCase().includes(q)) : options;\n const list: (ComboboxOption | CreateItem)[] = matched.slice(0, SHOWN_AT_MOST);\n if (onCreate && q && !options.some((o) => o.label.toLowerCase() === q))\n list.push({\n value: `__create__${query}`,\n label: query.trim(),\n __create: true,\n });\n return { filtered: list, hidden: Math.max(0, matched.length - SHOWN_AT_MOST) };\n }, [options, query, onCreate]);\n const report = useRef(onInputValueChange);\n report.current = onInputValueChange;\n const pending = useRef<ReturnType<typeof setTimeout> | null>(null);\n useEffect(() => {\n const timer = pending;\n return () => {\n if (timer.current) clearTimeout(timer.current);\n };\n }, []);\n const reportInput = (v: string) => {\n if (searchDelay <= 0) return report.current?.(v);\n if (pending.current) clearTimeout(pending.current);\n pending.current = setTimeout(() => {\n pending.current = null;\n report.current?.(v);\n }, searchDelay);\n };\n const rootValue = Array.isArray(current) ? current.flatMap((v) => byValue.get(v) ?? []) : current == null ? null : (byValue.get(current) ?? null);\n\n const handleChange = (v: unknown) => {\n const arr = Array.isArray(v) ? (v as (ComboboxOption | CreateItem)[]) : null;\n const created = (arr ?? [v as ComboboxOption | CreateItem | null]).find((x) => x && \"__create\" in x) as CreateItem | undefined;\n if (created) {\n onCreate?.(created.label);\n return;\n }\n const next = multiple ? (arr ?? []).map((x) => x.value) : ((v as ComboboxOption | null)?.value ?? null);\n if (props.value === undefined) setInner(next);\n if (multiple) (props.onValueChange as ((x: string[]) => void) | undefined)?.(next as string[]);\n else (props.onValueChange as ((x: string | null) => void) | undefined)?.(next as string | null);\n };\n\n const inputEl = (\n <BaseCombobox.Input\n ref={ref}\n placeholder={placeholder}\n {...(id ? { id } : {})}\n {...fc.controlProps}\n {...(ariaLabel ? { \"aria-label\": ariaLabel } : {})}\n {...(invalid || error ? { \"aria-invalid\": true } : {})}\n onKeyDown={keepValueOnEscape}\n className=\"min-w-0 flex-1 bg-transparent text-fg outline-none placeholder:text-fg-tertiary disabled:cursor-not-allowed disabled:text-fg-disabled\"\n />\n );\n\n const control = (\n <BaseCombobox.Root\n items={filtered}\n filteredItems={filtered}\n value={rootValue}\n onValueChange={handleChange}\n onInputValueChange={(v: string) => {\n setQuery(v);\n reportInput(v);\n }}\n autoHighlight\n itemToStringLabel={(o: ComboboxOption) => o?.label ?? \"\"}\n isItemEqualToValue={(a: ComboboxOption, b: ComboboxOption) => a?.value === b?.value}\n multiple={multiple === true}\n {...(disabled ? { disabled } : {})}\n {...(name ? { name } : {})}\n >\n {multiple ? (\n <BaseCombobox.Chips\n ref={fieldRef}\n {...(force ? { \"data-force\": force } : {})}\n className={cn(\n \"relative flex w-full flex-wrap items-center gap-4 rounded-field material-field transition-control cursor-text\",\n CHIPS[size].field,\n !(label || description || error) && className,\n )}\n >\n <BaseCombobox.Value>\n {(value: ComboboxOption[]) => (\n <>\n {value.map((o) => (\n <BaseCombobox.Chip key={o.value} aria-label={o.label} className=\"outline-none\">\n <Tag className=\"pe-2\">\n {o.label}\n <BaseCombobox.ChipRemove\n aria-label={t(\"combobox.remove\", \"Remove {label}\", { label: o.label })}\n className=\"ms-2 inline-flex size-24 items-center justify-center rounded-pill text-fg-tertiary transition-control hover:bg-fill-2 hover:text-fg\"\n >\n <Icon icon={__icon_Cancel01Icon} size=\"xs\" />\n </BaseCombobox.ChipRemove>\n </Tag>\n </BaseCombobox.Chip>\n ))}\n <span className={cn(\"flex min-w-64 flex-1 basis-64 items-center\", CHIPS[size].row, value.length === 0 ? \"px-12\" : \"px-8\")}>{inputEl}</span>\n <BaseCombobox.Trigger aria-label={t(\"combobox.showOptions\", \"Show options\")} className={cn(CHEVRON, \"absolute\", CHIPS[size].chevron)}>\n <Icon icon={__icon_ArrowDown01Icon} size=\"sm\" />\n </BaseCombobox.Trigger>\n </>\n )}\n </BaseCombobox.Value>\n </BaseCombobox.Chips>\n ) : (\n <BaseCombobox.InputGroup\n ref={fieldRef}\n {...(force ? { \"data-force\": force } : {})}\n className={cn(\n \"relative flex w-full min-w-0 items-center rounded-pill material-field transition-control cursor-text\",\n KAESO_COMBOBOX_VARIANTS.size[size].classes,\n \"pe-4\",\n !(label || description || error) && className,\n )}\n >\n {inputEl}\n <BaseCombobox.Trigger aria-label={t(\"combobox.showOptions\", \"Show options\")} className={CHEVRON}>\n <Icon icon={__icon_ArrowDown01Icon} size=\"sm\" />\n </BaseCombobox.Trigger>\n </BaseCombobox.InputGroup>\n )}\n <BaseCombobox.Portal container={usePortalContainer()}>\n <BaseCombobox.Positioner\n anchor={fieldRef}\n positionMethod=\"fixed\"\n collisionBoundary={pageBoundary()}\n align=\"start\"\n sideOffset={6}\n collisionPadding={8}\n className=\"z-50 outline-none\"\n >\n <BaseCombobox.Popup className={cn(MENU_POPUP, \"relative min-w-anchor overflow-hidden\")} style={anchorWidthStyle(fieldWidth)}>\n {loading && (\n <span aria-hidden className=\"absolute inset-x-16 top-0 h-2 overflow-hidden rounded-pill show-after-delay reduced:hidden\">\n <span className=\"block h-full w-1/3 animate-indeterminate rounded-pill bg-fg-tertiary\" />\n </span>\n )}\n <BaseCombobox.Status className=\"sr-only\">{loading ? t(\"combobox.loadingResults\", \"Loading results\") : \"\"}</BaseCombobox.Status>\n <BaseCombobox.Empty className=\"flex h-34 items-center px-10 text-body text-fg-secondary empty:hidden\">\n {loading\n ? t(\"combobox.loading\", \"Loading…\")\n : (emptyText ??\n (query.trim() ? t(\"combobox.noMatch\", \"No matches for “{query}”\", { query: query.trim() }) : t(\"combobox.noResults\", \"No results\")))}\n </BaseCombobox.Empty>\n <BaseCombobox.List className=\"-m-6 flex min-h-0 flex-col overflow-y-auto overscroll-contain p-6 outline-none scrollbar-quiet\">\n {(o: ComboboxOption | CreateItem) => (\n <BaseCombobox.Item key={o.value} value={o} {...(o.disabled ? { disabled: true } : {})} className={MENU_ITEM}>\n {\"__create\" in o ? (\n <>\n <Icon icon={__icon_Add01Icon} size=\"sm\" className={MENU_ICON} />\n <span className=\"min-w-0 flex-1 truncate\">\n {createLabel ? createLabel(o.label) : t(\"combobox.add\", \"Add “{label}”\", { label: o.label })}\n </span>\n </>\n ) : (\n <>\n {o.leading}\n {o.icon && <Icon icon={o.icon} size=\"sm\" className={MENU_ICON} />}\n <span className={cn(\"flex min-w-0 flex-1 flex-col\", o.description && \"gap-2 py-8\")}>\n <span className=\"truncate\">\n <Highlight text={o.label} query={query} />\n </span>\n {o.description && <span className=\"text-small font-regular text-fg-secondary\">{o.description}</span>}\n </span>\n <BaseCombobox.ItemIndicator\n keepMounted\n className=\"flex size-16 shrink-0 items-center justify-center text-fg opacity-0 data-selected:opacity-100\"\n >\n <Icon icon={__icon_Tick02Icon} size=\"sm\" />\n </BaseCombobox.ItemIndicator>\n </>\n )}\n </BaseCombobox.Item>\n )}\n </BaseCombobox.List>\n {hidden > 0 && (\n <div className=\"flex h-28 shrink-0 items-center px-10 text-caption font-medium text-fg-tertiary\">\n {t(\"combobox.more\", \"{count, plural, one {# more; type to narrow it down} other {# more; type to narrow them down}}\", { count: hidden })}\n </div>\n )}\n </BaseCombobox.Popup>\n </BaseCombobox.Positioner>\n </BaseCombobox.Portal>\n </BaseCombobox.Root>\n );\n if (field) return control;\n return withField(\n {\n label,\n description,\n error,\n optional,\n required,\n layout,\n id: fc.wrapId ?? id,\n disabled,\n className,\n },\n control,\n );\n});\nif (process.env.NODE_ENV !== \"production\") Combobox.displayName = \"Combobox\";\n\nexport const KAESO_AUTOCOMPLETE_VARIANTS = { size: KAESO_COMBOBOX_VARIANTS.size } as const;\nexport const KAESO_AUTOCOMPLETE_DEFAULT_VARIANTS = { size: \"md\" } as const;\n\nexport interface AutocompleteProps extends FieldWrapProps {\n suggestions: string[];\n value?: string | undefined;\n defaultValue?: string | undefined;\n onValueChange?: ((value: string) => void) | undefined;\n placeholder?: string | undefined;\n size?: InputSize | undefined;\n disabled?: boolean | undefined;\n id?: string | undefined;\n name?: string | undefined;\n leadingIcon?: IconData | undefined;\n \"aria-label\"?: string | undefined;\n className?: string | undefined;\n \"data-force\"?: string | undefined;\n}\n\nexport const Autocomplete = /* @__PURE__ */ forwardRef<HTMLInputElement, AutocompleteProps>(function Autocomplete(props, ref) {\n const {\n suggestions,\n value,\n defaultValue,\n onValueChange,\n placeholder,\n size = \"md\",\n disabled,\n id,\n name,\n leadingIcon,\n label,\n description,\n error,\n optional,\n required,\n layout,\n className,\n \"aria-label\": ariaLabel,\n \"data-force\": force,\n } = props;\n const field = useField();\n const fc = useFieldControl(props);\n const [query, setQuery] = useState(defaultValue ?? \"\");\n const fieldRef = useRef<HTMLDivElement | null>(null);\n const fieldWidth = useLayoutWidth(fieldRef);\n const current = value ?? query;\n const control = (\n <BaseAutocomplete.Root\n items={suggestions}\n {...(value !== undefined ? { value } : {})}\n {...(defaultValue !== undefined ? { defaultValue } : {})}\n onValueChange={(v: string) => {\n setQuery(v);\n onValueChange?.(v);\n }}\n {...(disabled ? { disabled } : {})}\n {...(name ? { name } : {})}\n >\n <BaseAutocomplete.InputGroup\n ref={fieldRef}\n {...(force ? { \"data-force\": force } : {})}\n className={cn(\n \"relative flex w-full min-w-0 items-center rounded-pill material-field transition-control cursor-text\",\n KAESO_AUTOCOMPLETE_VARIANTS.size[size].classes,\n leadingIcon && LEADING[size],\n !(label || description || error) && className,\n )}\n >\n {leadingIcon && <Icon icon={leadingIcon} size=\"sm\" className=\"text-fg-tertiary\" />}\n <BaseAutocomplete.Input\n ref={ref}\n placeholder={placeholder}\n {...(id ? { id } : {})}\n {...fc.controlProps}\n {...(ariaLabel ? { \"aria-label\": ariaLabel } : {})}\n onKeyDown={keepValueOnEscape}\n className=\"min-w-0 flex-1 bg-transparent text-fg outline-none placeholder:text-fg-tertiary disabled:text-fg-disabled\"\n />\n </BaseAutocomplete.InputGroup>\n <BaseAutocomplete.Portal container={usePortalContainer()}>\n <BaseAutocomplete.Positioner\n anchor={fieldRef}\n positionMethod=\"fixed\"\n collisionBoundary={pageBoundary()}\n align=\"start\"\n sideOffset={6}\n collisionPadding={8}\n className=\"z-50 outline-none\"\n >\n <BaseAutocomplete.Popup className={cn(MENU_POPUP, \"min-w-anchor overflow-hidden data-empty:hidden\")} style={anchorWidthStyle(fieldWidth)}>\n <BaseAutocomplete.List className=\"-m-6 flex min-h-0 flex-col overflow-y-auto overscroll-contain p-6 outline-none scrollbar-quiet\">\n {(s: string) => (\n <BaseAutocomplete.Item key={s} value={s} className={MENU_ITEM}>\n <span className=\"truncate\">\n <Highlight text={s} query={current} />\n </span>\n </BaseAutocomplete.Item>\n )}\n </BaseAutocomplete.List>\n </BaseAutocomplete.Popup>\n </BaseAutocomplete.Positioner>\n </BaseAutocomplete.Portal>\n </BaseAutocomplete.Root>\n );\n if (field) return control;\n return withField(\n {\n label,\n description,\n error,\n optional,\n required,\n layout,\n id: fc.wrapId ?? id,\n disabled,\n className,\n },\n control,\n );\n});\nif (process.env.NODE_ENV !== \"production\") Autocomplete.displayName = \"Autocomplete\";\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"core-CmK-8ObW.js","names":["cn","useUiText","mergeRefs","observeResize","SwapText","Button","Skeleton","Table","edgeColor","soft","color","wholeTicks","values","ticks","VIZ","VIZ_THIN","hash","h","i","s","NEAR","seriesIndex","id","assignSeries","out","ids","used","clash","k","keys","seriesColors","thin","seriesColor","tokenKindColor","tokenKindTint","tokenKindSeries","TOKEN_KIND_ORDER","tokenKindLabel","englishText","kind","useSize","el","setEl","useState","size","setSize","useLayoutEffect","set","ease","t","reducedMotion","mix","to","from","v","tweens","useTweened","key","tween","setTween","current","still","drawn","running","useEffect","start","raf","step","motion","useTweenedScale","any","top","ChartFrame","asTable","setAsTable","failed","state","blank","showTable","table","toTable","toChart","className","label","DataTablePlain","legend","toggle","NUMERIC","end","j","r","caption","sticky","c","Swatch","edge","off","shape","tickLabel","format","readableTicks","n","count","scale","lo","hi","dayNumber","d","m","yearOfDay","yearStarts","days","dates","prev","WIDE","labelWidth","em","ch","AXIS","LABEL_GAP","placeTimeLabels","placed","width","anchor","right","x","left","clear","a","b","kept","l","axisLabelIndexes","labels","fits","edges","room","every","starts","stride","score","p","best","Legend","onToggle","items","hidden","it","onHover","ChartTooltip","useRef","root","useMemo","ref","own","setOwn","node","next","heading","rows","visible","flip","wanted","xLeft","y","KAESO_CHARTS_VARIANTS","KAESO_CHARTS_DEFAULT_VARIANTS","chartKeyIndex","back","vertical","forward","index","useChartKeys","setIndex","options","keyboard","e","ChartLive","liveLine"],"sources":["../../src/components/charts/marks.ts","../../src/components/charts/core.tsx"],"sourcesContent":["export function edgeColor(color: string): string | undefined {\n const soft = /^var\\(--k-viz-(\\d)-soft\\)$/.exec(color);\n return soft ? `var(--k-viz-${soft[1]})` : undefined;\n}\n","import type * as React from \"react\";\nimport { forwardRef, useEffect, useLayoutEffect, useMemo, useRef, useState, type ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn.js\";\nimport { observeResize } from \"../../utils/observe-resize.js\";\nimport { mergeRefs } from \"../../utils/merge-refs.js\";\nimport { motion, tokenKindSeries, tokenKindTint } from \"@logicplanes/kaeso-tokens\";\nimport { Skeleton } from \"../skeleton/skeleton.js\";\nimport { Button } from \"../button/button.js\";\nimport { SwapText } from \"../swap-text/swap-text.js\";\nimport { Table } from \"../table/table.js\";\nimport { edgeColor } from \"./marks.js\";\nimport { englishText, useUiText, type UiText } from \"../../i18n/context.js\";\n\nexport function wholeTicks(ticks: number[], values: number[]): number[] {\n return values.every(Number.isInteger) ? ticks.filter(Number.isInteger) : ticks;\n}\nexport const VIZ = [\n \"var(--k-viz-1)\",\n \"var(--k-viz-2)\",\n \"var(--k-viz-3)\",\n \"var(--k-viz-4)\",\n \"var(--k-viz-5)\",\n \"var(--k-viz-6)\",\n \"var(--k-viz-7)\",\n \"var(--k-viz-8)\",\n] as const;\nexport const VIZ_THIN = [\n \"var(--k-viz-thin-1)\",\n \"var(--k-viz-thin-2)\",\n \"var(--k-viz-thin-3)\",\n \"var(--k-viz-thin-4)\",\n \"var(--k-viz-thin-5)\",\n \"var(--k-viz-thin-6)\",\n \"var(--k-viz-thin-7)\",\n \"var(--k-viz-thin-8)\",\n] as const;\n\nfunction hash(s: string) {\n let h = 2166136261;\n for (let i = 0; i < s.length; i++) h = Math.imul(h ^ s.charCodeAt(i), 16777619);\n return Math.abs(h);\n}\nconst NEAR: Record<number, number> = { 1: 6, 6: 1, 2: 5, 5: 2, 3: 7, 7: 3 };\n\nexport function seriesIndex(id: string): number {\n return hash(id) % VIZ.length;\n}\n\nexport function assignSeries(ids: string[]): Map<string, number> {\n const out = new Map<string, number>();\n if (new Set(ids).size === 1) return new Map([[ids[0]!, 0]]);\n const used = new Set<number>();\n const clash = (k: number) => used.has(k) || (NEAR[k] !== undefined && used.has(NEAR[k]!));\n for (const id of ids) {\n if (out.has(id)) continue;\n let i = seriesIndex(id);\n if (clash(i)) {\n const keys = [...VIZ.keys()];\n i = keys.find((k) => !clash(k)) ?? keys.find((k) => !used.has(k)) ?? i;\n }\n used.add(i);\n out.set(id, i);\n }\n return out;\n}\n\nexport function seriesColors(ids: string[], thin = false): Map<string, string> {\n return new Map([...assignSeries(ids)].map(([id, i]) => [id, (thin ? VIZ_THIN : VIZ)[i]!]));\n}\n\nexport const seriesColor = (id: string, thin = false) => (thin ? VIZ_THIN : VIZ)[seriesIndex(id)]!;\n\nexport type TokenKind = keyof typeof tokenKindSeries;\nexport const tokenKindColor = (k: TokenKind, thin = false) => {\n if (tokenKindTint[k]) return \"var(--k-viz-1-soft)\";\n return (thin ? VIZ_THIN : VIZ)[tokenKindSeries[k] - 1]!;\n};\nexport const TOKEN_KIND_ORDER: TokenKind[] = [\"input\", \"cacheRead\", \"cacheWrite\", \"output\", \"reasoning\"];\nexport function tokenKindLabel(kind: TokenKind, t: UiText = englishText): string {\n switch (kind) {\n case \"input\":\n return t(\"tokenKind.input\", \"Input\");\n case \"output\":\n return t(\"tokenKind.output\", \"Output\");\n case \"cacheRead\":\n return t(\"tokenKind.cacheRead\", \"Cache read\");\n case \"cacheWrite\":\n return t(\"tokenKind.cacheWrite\", \"Cache write\");\n case \"reasoning\":\n return t(\"tokenKind.reasoning\", \"Reasoning\");\n }\n}\n\nexport function useSize<T extends HTMLElement>(): [(el: T | null) => void, { width: number; height: number }] {\n const [el, setEl] = useState<T | null>(null);\n const [size, setSize] = useState({ width: 0, height: 0 });\n useLayoutEffect(() => {\n if (!el) return;\n const set = () => setSize({ width: Math.round(el.clientWidth), height: Math.round(el.clientHeight) });\n set();\n return observeResize([el], set);\n }, [el]);\n return [setEl, size];\n}\n\nconst ease = (t: number) => 1 - Math.pow(1 - t, 3);\nconst reducedMotion = () => typeof matchMedia !== \"undefined\" && matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\nconst mix = (from: number[], to: number[], t: number) => (t >= 1 ? to : to.map((v, i) => (from[i] ?? v) + (v - (from[i] ?? v)) * ease(t)));\n\nexport function tweens(from: number[], to: number[]): boolean {\n return from.length === to.length && from.some((v) => v !== 0) && to.some((v) => v !== 0) && from.some((v, i) => v !== to[i]) && !reducedMotion();\n}\n\nexport function useTweened(values: number[], still = false): number[] {\n const key = values.join(\",\");\n const [tween, setTween] = useState({ key, from: values, to: values, t: 1, still });\n let current = tween;\n if (tween.key !== key || tween.still !== still) {\n const drawn = mix(tween.from, tween.to, tween.t);\n const animate = !still && !tween.still && tweens(drawn, values);\n current = animate ? { key, from: drawn, to: values, t: 0, still } : { key, from: values, to: values, t: 1, still };\n setTween(current);\n }\n const running = current.t < 1;\n useEffect(() => {\n if (!running) return;\n const start = performance.now();\n let raf = 0;\n const step = () => {\n const t = Math.max(0, Math.min(1, (performance.now() - start) / motion.duration.chart));\n setTween((s) => (s.key === key ? { ...s, t } : s));\n if (t < 1) raf = requestAnimationFrame(step);\n };\n raf = requestAnimationFrame(step);\n return () => cancelAnimationFrame(raf);\n }, [key, running]);\n return mix(current.from, current.to, current.t);\n}\n\nexport function useTweenedScale(values: number[], top: number, still = false): { values: number[]; top: number } {\n const any = values.some((v) => v !== 0);\n const drawn = useTweened(any ? [...values, top] : values, still);\n return any ? { values: drawn.slice(0, -1), top: drawn[drawn.length - 1] ?? top } : { values: drawn, top };\n}\n\nexport interface ChartState {\n loading?: boolean | undefined;\n error?: ReactNode | undefined;\n onRetry?: (() => void) | undefined;\n empty?: boolean | undefined;\n emptyText?: ReactNode | undefined;\n}\n\nexport interface TableData {\n columns: string[];\n rows: (string | number)[][];\n}\n\nexport interface ChartFrameProps {\n label: string;\n height: number;\n children: ReactNode;\n table?: TableData | undefined;\n legend?: ReactNode | undefined;\n state?: ChartState | undefined;\n className?: string | undefined;\n toggle?: boolean | undefined;\n}\n\nexport const ChartFrame = /* @__PURE__ */ forwardRef<HTMLElement, ChartFrameProps>(function ChartFrame(\n { label, height, children, table, legend, state = {}, className, toggle = true },\n ref,\n) {\n const [asTable, setAsTable] = useState(false);\n const t = useUiText();\n const failed = !!state.error;\n const blank = !!state.empty;\n const showTable = asTable && !!table && !failed && !blank;\n const toTable = t(\"chartFrame.viewAsTable\", \"View as table\");\n const toChart = t(\"chartFrame.viewAsChart\", \"View as chart\");\n return (\n <figure\n ref={ref}\n className={cn(\"@container flex w-full min-w-0 flex-col gap-12\", className)}\n aria-label={label}\n {...(state.loading ? { \"aria-busy\": true } : {})}\n >\n {failed ? (\n <div className=\"flex flex-col items-center justify-center gap-12 px-24 text-center\" style={{ height }}>\n <p role=\"alert\" className=\"text-body text-pretty text-fg-secondary\">\n {state.onRetry\n ? t(\"chartFrame.loadFailed\", \"Couldn't load this chart\")\n : t(\"chartFrame.loadFailedReload\", \"Couldn't load this chart. Reload the page to try again.\")}\n </p>\n {state.onRetry && (\n <Button size=\"sm\" variant=\"secondary\" onClick={state.onRetry}>\n {t(\"chartFrame.tryAgain\", \"Try again\")}\n </Button>\n )}\n </div>\n ) : showTable ? (\n <div style={{ height }}>\n <div\n role=\"region\"\n tabIndex={0}\n aria-label={t(\"chartFrame.tableLabel\", \"{label}, table\", { label })}\n className=\"h-full overflow-auto overscroll-contain scrollbar-quiet focus-ring-inset\"\n >\n <DataTablePlain table={table} sticky />\n </div>\n </div>\n ) : (\n <div className=\"relative\" style={{ height }}>\n {state.loading && state.empty ? (\n <Skeleton className=\"absolute inset-0\" />\n ) : (\n <div className={cn(\"absolute inset-0\", state.loading && \"opacity-40\")}>\n <div className={cn(\"absolute inset-0\", state.loading && \"animate-pulse-quiet\")}>{children}</div>\n </div>\n )}\n {state.empty && !state.loading && (\n <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center px-24 text-center text-body text-pretty text-fg-secondary\">\n {state.emptyText ?? t(\"chartFrame.noData\", \"No data for this period\")}\n </div>\n )}\n </div>\n )}\n {!failed && (legend || (toggle && table && !blank)) && (\n <div className=\"flex flex-col gap-8 @chart-legend:flex-row @chart-legend:gap-12\">\n {!showTable && legend && <div className=\"min-w-0 @chart-legend:flex-1\">{legend}</div>}\n {toggle && table && !blank && (\n <button\n type=\"button\"\n onClick={() => setAsTable((v) => !v)}\n className=\"relative ml-auto inline-flex h-28 shrink-0 cursor-pointer items-center self-end rounded-pill px-10 text-small font-medium text-fg-secondary transition-control hover:bg-fill-1 hover:text-fg focus-ring tap-target\"\n >\n <SwapText reserve={[toTable, toChart]}>{showTable ? toChart : toTable}</SwapText>\n </button>\n )}\n </div>\n )}\n {table && !showTable && (\n <div className=\"sr-only\">\n <DataTablePlain table={table} caption={label} />\n </div>\n )}\n </figure>\n );\n});\nif (process.env.NODE_ENV !== \"production\") ChartFrame.displayName = \"ChartFrame\";\n\nconst NUMERIC = /^[^\\p{L}]*\\d[^\\p{L}]*\\p{L}{0,3}$/u;\n\nfunction DataTablePlain({ table, caption, sticky }: { table: TableData; caption?: string | undefined; sticky?: boolean | undefined }) {\n const end = table.columns.map(\n (_, j) => j > 0 && table.rows.every((r) => typeof r[j] === \"number\" || NUMERIC.test(String(r[j] ?? \"\").trim()) || r[j] === \"–\"),\n );\n return (\n <Table>\n {caption && <caption className=\"sr-only\">{caption}</caption>}\n <Table.Head>\n <Table.Row>\n {table.columns.map((c, i) => (\n <Table.HeaderCell key={c} align={end[i] ? \"end\" : \"start\"} className={cn(sticky && \"sticky top-0 z-10 bg-panel\")}>\n {c}\n </Table.HeaderCell>\n ))}\n </Table.Row>\n </Table.Head>\n <Table.Body>\n {table.rows.map((r, i) => (\n <Table.Row key={i}>\n {r.map((v, j) => (\n <Table.Cell key={j} align={end[j] ? \"end\" : \"start\"}>\n {v}\n </Table.Cell>\n ))}\n </Table.Row>\n ))}\n </Table.Body>\n </Table>\n );\n}\n\nexport interface LegendItem {\n id: string;\n label: ReactNode;\n color: string;\n value?: ReactNode | undefined;\n}\n\nexport interface SwatchProps {\n color: string;\n shape?: \"square\" | \"line\" | undefined;\n off?: boolean | undefined;\n}\n\nexport const Swatch = /* @__PURE__ */ forwardRef<HTMLSpanElement, SwatchProps>(function Swatch({ color, shape = \"square\", off }, ref) {\n const edge = edgeColor(color);\n return (\n <span\n ref={ref}\n aria-hidden\n data-off={off ? \"\" : undefined}\n className={cn(\"shrink-0 data-mark transition-control\", shape === \"line\" ? \"h-2 w-12 rounded-pill\" : \"size-10 rounded-bar\")}\n style={\n off\n ? shape === \"line\"\n ? { outline: `1px solid ${edge ?? color}`, outlineOffset: 1 }\n : { boxShadow: `inset 0 0 0 1px ${edge ?? color}` }\n : { background: color, ...(edge && shape === \"square\" ? { boxShadow: `inset 0 0 0 1px ${edge}` } : {}) }\n }\n />\n );\n});\nif (process.env.NODE_ENV !== \"production\") Swatch.displayName = \"Swatch\";\n\nexport const tickLabel = (format: (v: number) => string) => (v: number) => format(v).replace(/[.,]00(?=\\D*$)/, \"\");\n\nexport function readableTicks(scale: { ticks: (count: number) => number[]; domain: () => number[] }, label: (v: number) => string, count = 4): number[] {\n for (let n = count; n >= 1; n--) {\n const ticks = scale.ticks(n);\n if (new Set(ticks.map(label)).size === ticks.length) return ticks;\n }\n const [lo = 0, hi = 0] = scale.domain();\n return label(lo) === label(hi) ? [lo] : [lo, hi];\n}\n\nexport type AxisDate = Date | string;\n\nfunction dayNumber(d: AxisDate): number {\n if (d instanceof Date) return Number.isNaN(d.getTime()) ? NaN : Date.UTC(d.getFullYear(), d.getMonth(), d.getDate()) / 86_400_000;\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})/.exec(d);\n return m ? Date.UTC(Number(m[1]), Number(m[2]) - 1, Number(m[3])) / 86_400_000 : NaN;\n}\nconst yearOfDay = (n: number) => new Date(n * 86_400_000).getUTCFullYear();\n\nexport function yearStarts(dates: readonly AxisDate[]): number[] {\n const days = dates.map(dayNumber);\n const out: number[] = [];\n days.forEach((d, i) => {\n const prev = i > 0 ? days[i - 1]! : days.length > 1 ? 2 * d - days[1]! : NaN;\n if (Number.isFinite(d) && Number.isFinite(prev) && yearOfDay(d) !== yearOfDay(prev)) out.push(i);\n });\n return out;\n}\n\nconst WIDE = /[\\p{Script=Han}\\p{Script=Hiragana}\\p{Script=Katakana}\\p{Script=Hangul}\\u3000-\\u303f\\uff00-\\uffef]/u;\n\nexport function labelWidth(label: string): number {\n let em = 0;\n for (const ch of label) em += WIDE.test(ch) ? 1 : /\\p{Lu}/u.test(ch) ? 0.8 : /\\p{Ll}/u.test(ch) ? 0.6 : /\\p{Nd}/u.test(ch) ? 0.66 : /\\s/.test(ch) ? 0.3 : 0.4;\n return em * AXIS.label.fontSize;\n}\n\nconst LABEL_GAP = 8;\n\nexport function placeTimeLabels(\n ticks: { key: number; at: number; label: string }[],\n right: number,\n): { key: number; x: number; anchor: \"start\" | \"middle\" | \"end\"; label: string }[] {\n const placed = ticks.map((t) => {\n const width = labelWidth(t.label);\n const anchor: \"start\" | \"middle\" | \"end\" = t.at - width / 2 < 0 ? \"start\" : t.at + width / 2 > right ? \"end\" : \"middle\";\n const x = anchor === \"start\" ? Math.max(t.at, 0) : t.at;\n const left = anchor === \"start\" ? x : anchor === \"end\" ? x - width : x - width / 2;\n return { key: t.key, x, anchor, label: t.label, left, right: left + width };\n });\n const clear = (a: { right: number } | undefined, b: { left: number } | undefined) => !a || !b || a.right + LABEL_GAP <= b.left;\n if (placed.length > 2 && !clear(placed[0], placed[1])) placed.splice(1, 1);\n if (placed.length > 2 && !clear(placed[placed.length - 2], placed[placed.length - 1])) placed.splice(placed.length - 2, 1);\n const kept: typeof placed = [];\n for (const l of placed) if (clear(kept[kept.length - 1], l)) kept.push(l);\n return kept.map(({ key, x, anchor, label }) => ({ key, x, anchor, label }));\n}\n\nexport function axisLabelIndexes(\n labels: string[],\n step: number,\n edges: { start: number; end: number } = { start: Infinity, end: Infinity },\n dates?: readonly AxisDate[] | undefined,\n): number[] {\n const n = labels.length;\n if (n === 0) return [];\n const fits = (i: number) => labelWidth(labels[i]!) / 2 <= Math.min(edges.start + i * step, edges.end + (n - 1 - i) * step) + 1e-6;\n const room = Math.max(48, Math.max(...labels.map(labelWidth)) + 16);\n const every = step > 0 ? Math.max(1, Math.ceil(room / step - 1e-6)) : n;\n const starts = dates && dates.length === n ? yearStarts(dates) : [];\n let stride = every;\n for (let s = every; every > 1 && s <= every * 2; s++) {\n if (starts.every((i) => (i - starts[0]!) % s === 0)) {\n stride = s;\n break;\n }\n }\n const score = (p: number) => [\n starts.filter((i) => i % stride === p && fits(i)).length,\n (n - 1) % stride === p && fits(n - 1) ? 1 : 0,\n p === 0 && fits(0) ? 1 : 0,\n n - 1 - ((n - 1 - p) % stride),\n ];\n let best = 0;\n for (let p = 1; p < Math.min(stride, n); p++) {\n const a = score(p);\n const b = score(best);\n const k = a.findIndex((v, j) => v !== b[j]);\n if (k >= 0 && a[k]! > b[k]!) best = p;\n }\n const out: number[] = [];\n for (let i = best; i < n; i += stride) if (fits(i)) out.push(i);\n return out;\n}\n\nexport interface LegendProps {\n items: LegendItem[];\n hidden?: Set<string> | undefined;\n onToggle?: ((id: string) => void) | undefined;\n onHover?: ((id: string | null) => void) | undefined;\n shape?: \"square\" | \"line\" | undefined;\n}\n\nexport const Legend = /* @__PURE__ */ forwardRef<HTMLUListElement, LegendProps>(function Legend({ items, hidden, onToggle, onHover, shape = \"square\" }, ref) {\n const t = useUiText();\n return (\n <ul ref={ref} className={cn(\"flex flex-wrap items-center\", onToggle ? \"gap-4\" : \"gap-x-16 gap-y-4\")} aria-label={t(\"chartLegend.label\", \"Legend\")}>\n {items.map((it) => {\n const off = hidden?.has(it.id);\n const Comp = onToggle ? \"button\" : \"span\";\n return (\n <li key={it.id}>\n <Comp\n {...(onToggle ? { type: \"button\" as const, \"aria-pressed\": !off, onClick: () => onToggle(it.id) } : {})}\n onMouseEnter={() => onHover?.(it.id)}\n onMouseLeave={() => onHover?.(null)}\n onFocus={() => onHover?.(it.id)}\n onBlur={() => onHover?.(null)}\n className={cn(\n \"inline-flex h-28 items-center gap-8 text-small font-medium transition-control\",\n onToggle && \"relative cursor-pointer rounded-pill px-10 hover:bg-fill-1 focus-ring tap-target\",\n off ? \"text-fg-tertiary\" : \"text-fg\",\n )}\n >\n <Swatch color={it.color} shape={shape} off={off} />\n {it.label}\n {it.value !== undefined && <span className=\"text-fg-secondary tabular\">{it.value}</span>}\n </Comp>\n </li>\n );\n })}\n </ul>\n );\n});\nif (process.env.NODE_ENV !== \"production\") Legend.displayName = \"Legend\";\n\nexport interface TooltipRow {\n id: string;\n label: ReactNode;\n color: string;\n value: ReactNode;\n share?: ReactNode | undefined;\n}\n\nexport interface ChartTooltipProps {\n x: number;\n xLeft?: number | undefined;\n y: number;\n width: number;\n heading: ReactNode;\n rows: TooltipRow[];\n visible: boolean;\n}\n\nexport const ChartTooltip = /* @__PURE__ */ forwardRef<HTMLDivElement, ChartTooltipProps>(function ChartTooltip({ x, xLeft = x, y, width, heading, rows, visible }, ref) {\n const el = useRef<HTMLDivElement | null>(null);\n const root = useMemo(() => mergeRefs(el, ref), [ref]);\n const [own, setOwn] = useState({ w: 0, h: 0, room: Infinity });\n useLayoutEffect(() => {\n const node = el.current;\n const next = { w: node?.offsetWidth ?? 0, h: node?.offsetHeight ?? 0, room: (node?.offsetParent as HTMLElement | null)?.clientHeight ?? Infinity };\n if (next.w !== own.w || next.h !== own.h || next.room !== own.room) setOwn(next);\n }, [own, heading, rows, visible]);\n const flip = x > width / 2;\n const wanted = flip ? xLeft - 16 - own.w : x + 16;\n const left = own.w ? Math.round(Math.max(0, Math.min(wanted, width - own.w))) : undefined;\n const top = Math.round(Math.max(0, Math.min(y - 24, own.room - own.h)));\n return (\n <div\n ref={root}\n role=\"presentation\"\n aria-hidden\n className={cn(\n \"pointer-events-none absolute z-10 w-max min-w-160 max-w-360 rounded-tooltip bg-raised p-10 text-small shadow-raised opacity-motion @chart-legend:min-w-200\",\n visible && own.w ? \"opacity-100\" : \"opacity-0\",\n )}\n style={{\n ...(left !== undefined ? { left } : flip ? { right: Math.round(width - xLeft + 16) } : { left: Math.round(x + 16) }),\n top,\n }}\n >\n <div className=\"mb-6 text-caption font-medium text-fg tabular\">{heading}</div>\n <div className=\"flex flex-col gap-4\">\n {rows.map((r) => (\n <div key={r.id} className=\"flex items-center gap-8\">\n <Swatch color={r.color} />\n <span className=\"min-w-0 flex-1 truncate pr-12 text-fg-secondary\">{r.label}</span>\n <span className=\"font-medium text-fg tabular\">{r.value}</span>\n {r.share !== undefined && <span className=\"w-40 text-right text-fg-tertiary tabular\">{r.share}</span>}\n </div>\n ))}\n </div>\n </div>\n );\n});\nif (process.env.NODE_ENV !== \"production\") ChartTooltip.displayName = \"ChartTooltip\";\n\nexport const AXIS = {\n grid: { stroke: \"var(--k-line)\", strokeDasharray: \"3 3\", strokeWidth: 1 },\n baseline: { stroke: \"var(--k-line-strong)\", strokeWidth: 1 },\n label: { fill: \"var(--k-text-tertiary)\", fontSize: 12, fontWeight: 500, style: { fontVariantNumeric: \"tabular-nums\" as const } },\n};\n\nexport const KAESO_CHARTS_VARIANTS = {\n chrome: { default: { classes: \"\" } },\n} as const;\nexport const KAESO_CHARTS_DEFAULT_VARIANTS = { chrome: \"default\" } as const;\n\nexport function chartKeyIndex(\n key: string,\n index: number | null,\n count: number,\n { vertical = false, start = count - 1 }: { vertical?: boolean | undefined; start?: number | undefined } = {},\n): number | null | undefined {\n if (count <= 0) return undefined;\n const back = vertical ? \"ArrowUp\" : \"ArrowLeft\";\n const forward = vertical ? \"ArrowDown\" : \"ArrowRight\";\n if (key === back) return index === null ? start : Math.max(0, index - 1);\n if (key === forward) return index === null ? start : Math.min(count - 1, index + 1);\n if (key === \"Home\") return 0;\n if (key === \"End\") return count - 1;\n if (key === \"Escape\") return index === null ? undefined : null;\n return undefined;\n}\n\nexport function useChartKeys(count: number, options: { vertical?: boolean | undefined; start?: number | undefined } = {}) {\n const [index, setIndex] = useState<number | null>(null);\n const start = options.start ?? count - 1;\n const props = {\n tabIndex: count > 0 ? 0 : -1,\n onFocus: (e: React.FocusEvent<HTMLElement>) => {\n if (e.target !== e.currentTarget) return;\n let keyboard = true;\n try {\n keyboard = e.currentTarget.matches(\":focus-visible\");\n } catch {}\n if (keyboard && !document.documentElement.hasAttribute(\"data-k-pointer\")) setIndex(Math.max(0, start));\n },\n onBlur: () => setIndex(null),\n onKeyDown: (e: React.KeyboardEvent<HTMLElement>) => {\n const next = chartKeyIndex(e.key, index, count, { vertical: !!options.vertical, start });\n if (next === undefined) return;\n e.preventDefault();\n if (next === null) e.stopPropagation();\n setIndex(next);\n },\n };\n return { index: index !== null && index < count ? index : null, props };\n}\n\nexport interface ChartLiveProps {\n children?: ReactNode | undefined;\n}\n\nexport const ChartLive = /* @__PURE__ */ forwardRef<HTMLDivElement, ChartLiveProps>(function ChartLive({ children }, ref) {\n return (\n <div ref={ref} className=\"sr-only\" aria-live=\"polite\" aria-atomic>\n {children}\n </div>\n );\n});\nif (process.env.NODE_ENV !== \"production\") ChartLive.displayName = \"ChartLive\";\n\nexport const liveLine = (heading: ReactNode, rows: { label: ReactNode; value: ReactNode }[], t: UiText = englishText) =>\n t(\"chart.liveLine\", \"{heading}: {values}\", {\n heading: String(heading),\n values: rows.map((r) => t(\"chart.liveValue\", \"{label} {value}\", { label: String(r.label), value: String(r.value) })).join(t(\"chart.listSeparator\", \", \")),\n });\n"],"mappings":"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"}