@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/NOTICE.md CHANGED
@@ -1,5 +1,5 @@
1
1
  # Notices
2
2
 
3
- Fonts: Inter (SIL Open Font License 1.1) and Geist Mono (SIL Open Font License 1.1), self-hosted as unmodified subsets of their Fontsource builds and shipped in `dist/fonts/` with `LICENSE-Inter.txt` and `LICENSE-GeistMono.txt`. Icons: Hugeicons free, Stroke Rounded (MIT). Provider marks: the trademarks of the providers they name, shown only to identify each provider, from each provider's own vector in one colour. Client marks: the trademarks of the agent clients they name, from Simple Icons (CC0 1.0), in one colour. The repository's `NOTICE.md` lists the source of each.
3
+ Fonts: Inter (SIL Open Font License 1.1) and Geist Mono (SIL Open Font License 1.1), self-hosted as unmodified subsets of their Fontsource builds and shipped in `dist/fonts/` with `LICENSE-Inter.txt` and `LICENSE-GeistMono.txt`. Icons: Hugeicons free, Stroke Rounded (MIT). Provider marks: the trademarks of the providers they name, shown only to identify each provider, from each provider's own vector in one colour. All trademarks belong to their owners; Kaeso is not affiliated with, endorsed or sponsored by any of them. Client marks: the trademarks of the agent clients they name, from Simple Icons (CC0 1.0), in one colour. The repository's `NOTICE.md` lists the source of each.
4
4
 
5
5
  The runtime dependencies are listed in `package.json`; each is MIT, ISC, BSD-2-Clause, BSD-3-Clause, Apache-2.0 or 0BSD licensed.
@@ -1,6 +1,6 @@
1
1
  # @logicplanes/kaeso-ui component guides
2
2
 
3
- Version 0.4.6. Generated from the showcase's demo modules (apps/showcase/src/demos); do not edit. For each component: what it is for, its import, keyboard, accessibility, do and don't, and every example's code. Props and variants: `component-registry.md`.
3
+ Version 0.4.8. Generated from the showcase's demo modules (apps/showcase/src/demos); do not edit. For each component: what it is for, its import, keyboard, accessibility, do and don't, and every example's code. Props and variants: `component-registry.md`.
4
4
 
5
5
  ## AgentAttribution
6
6
 
@@ -2083,6 +2083,40 @@ function Page() {
2083
2083
  }
2084
2084
  ```
2085
2085
 
2086
+ ## FilterToggle
2087
+
2088
+ An on-or-off filter as a pill that sits in a row of selects.
2089
+
2090
+ `import { FilterToggle } from "@logicplanes/kaeso-ui";`
2091
+
2092
+ ### Keyboard
2093
+
2094
+ | Key | Action |
2095
+ |---|---|
2096
+ | Space or Enter | Turns the filter on or off |
2097
+
2098
+ ### Accessibility
2099
+
2100
+ - A button with aria-pressed, named by its label; the check is decoration.
2101
+
2102
+ ### Examples
2103
+
2104
+ #### In a filter row
2105
+
2106
+ ```tsx
2107
+ function Row() {
2108
+ const [agents, setAgents] = useState(false);
2109
+ const [overridden, setOverridden] = useState(true);
2110
+ return (
2111
+ <div className="flex flex-wrap items-center gap-8">
2112
+ <Select size="sm" aria-label="Actor" placeholder="Any actor" options={[{ value: "ada", label: "Ada Okafor" }]} value={null} onValueChange={() => {}} />
2113
+ <FilterToggle label="Agents" pressed={agents} onPressedChange={setAgents} />
2114
+ <FilterToggle label="Only overridden" pressed={overridden} onPressedChange={setOverridden} />
2115
+ </div>
2116
+ );
2117
+ }
2118
+ ```
2119
+
2086
2120
  ## Flow
2087
2121
 
2088
2122
  A node-and-connector diagram for the route: app → Kaeso → provider and model.
@@ -2502,7 +2536,7 @@ Kaeso's identities: a redacted key with its state, a model with its provider and
2502
2536
 
2503
2537
  ### Accessibility
2504
2538
 
2505
- - Providers show their mark in its owner's one-colour version for the theme; others a letter. The name is always next to it or its accessible label.
2539
+ - Providers show their mark in its owner's colours for the theme; others a letter. The name is always next to it or its accessible label.
2506
2540
  - Capability icons have tooltips and are summarized in an accessible label.
2507
2541
  - Status codes carry their phrase for screen readers.
2508
2542
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "package": "@logicplanes/kaeso-ui",
3
- "version": "0.4.6",
3
+ "version": "0.4.8",
4
4
  "components": [
5
5
  {
6
6
  "entry": "agent-avatar",
@@ -2906,7 +2906,7 @@
2906
2906
  "type": "ComboboxOption[]",
2907
2907
  "required": true,
2908
2908
  "default": null,
2909
- "description": "The options to choose from."
2909
+ "description": "The options to choose from: a label, and optionally a description under it, a short meta value on the row's end (such as a time zone's offset), and a leading icon or element."
2910
2910
  },
2911
2911
  {
2912
2912
  "name": "aria-label",
@@ -5584,6 +5584,61 @@
5584
5584
  }
5585
5585
  }
5586
5586
  },
5587
+ {
5588
+ "entry": "filter-toggle",
5589
+ "kind": "components",
5590
+ "import": "@logicplanes/kaeso-ui/filter-toggle",
5591
+ "components": [
5592
+ {
5593
+ "name": "FilterToggle",
5594
+ "description": "An on-or-off filter as a pill that sits in a row of selects: quiet like an unset select when off, a check and full text when on. Use it instead of a switch in filter rows and toolbars.",
5595
+ "props": [
5596
+ {
5597
+ "name": "label",
5598
+ "type": "ReactNode",
5599
+ "required": true,
5600
+ "default": null,
5601
+ "description": "What the filter keeps, such as “Agents”."
5602
+ },
5603
+ {
5604
+ "name": "onPressedChange",
5605
+ "type": "(pressed: boolean) => void",
5606
+ "required": true,
5607
+ "default": null,
5608
+ "description": "Called with the new state when it is pressed."
5609
+ },
5610
+ {
5611
+ "name": "pressed",
5612
+ "type": "boolean",
5613
+ "required": true,
5614
+ "default": null,
5615
+ "description": "Whether the filter is on."
5616
+ },
5617
+ {
5618
+ "name": "size",
5619
+ "type": "\"md\" | \"sm\"",
5620
+ "required": false,
5621
+ "default": "sm",
5622
+ "description": "Its height, matched to the selects beside it."
5623
+ }
5624
+ ],
5625
+ "file": "src/components/filter-toggle/filter-toggle.tsx"
5626
+ }
5627
+ ],
5628
+ "variants": {
5629
+ "FILTER_TOGGLE": {
5630
+ "axes": {
5631
+ "size": {
5632
+ "sm": "32px: beside small selects in toolbars and filter rows (default)",
5633
+ "md": "36px: beside default selects"
5634
+ }
5635
+ },
5636
+ "defaults": {
5637
+ "size": "sm"
5638
+ }
5639
+ }
5640
+ }
5641
+ },
5587
5642
  {
5588
5643
  "entry": "flow",
5589
5644
  "kind": "components",
@@ -7206,13 +7261,20 @@
7206
7261
  "required": false,
7207
7262
  "default": null,
7208
7263
  "description": "The provider's name from the gateway's provider list, which names its mark for screen readers; the id without it."
7264
+ },
7265
+ {
7266
+ "name": "stacked",
7267
+ "type": "boolean",
7268
+ "required": false,
7269
+ "default": "false",
7270
+ "description": "With a name, puts the model id on its own line under it, so neither is cut short; for rows tall enough for two lines."
7209
7271
  }
7210
7272
  ],
7211
7273
  "file": "src/components/kaeso/identity.tsx"
7212
7274
  },
7213
7275
  {
7214
7276
  "name": "ProviderBadge",
7215
- "description": "A provider's mark on a quiet tile, in the provider's own one-colour version for the theme; for providers without one, the first letter of their name.",
7277
+ "description": "A provider's mark on a quiet tile, in the provider's own colours for the theme, or the text colour for a mark its owner draws in black and white; for a provider without a mark, the first letter of its name.",
7216
7278
  "props": [
7217
7279
  {
7218
7280
  "name": "provider",
@@ -13127,7 +13189,7 @@
13127
13189
  "PILL_TABS": {
13128
13190
  "axes": {
13129
13191
  "variant": {
13130
- "underline": "Underline tabs for detail pages: 40px, labels 12px in like every box, a 2px ink indicator under the label that slides",
13192
+ "underline": "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",
13131
13193
  "pill": "Header tabs: separate 32px pills, the active one filled; the first pill's edge on the gutter"
13132
13194
  }
13133
13195
  },
@@ -13138,7 +13200,7 @@
13138
13200
  "TABS": {
13139
13201
  "axes": {
13140
13202
  "variant": {
13141
- "underline": "Underline tabs for detail pages: 40px, labels 12px in like every box, a 2px ink indicator under the label that slides",
13203
+ "underline": "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",
13142
13204
  "pill": "Header tabs: separate 32px pills, the active one filled; the first pill's edge on the gutter"
13143
13205
  }
13144
13206
  },
@@ -1,6 +1,6 @@
1
1
  # @logicplanes/kaeso-ui component registry
2
2
 
3
- Version 0.4.6. Generated from the component types, their descriptions and variants; do not edit.
3
+ Version 0.4.8. Generated from the component types, their descriptions and variants; do not edit.
4
4
 
5
5
  ## agent-avatar
6
6
 
@@ -675,7 +675,7 @@ A pill input with a filtered list: matched characters highlighted, async, chips
675
675
 
676
676
  | Prop | Type | Default | Description |
677
677
  |---|---|---|---|
678
- | `options` * | `ComboboxOption[]` | | The options to choose from. |
678
+ | `options` * | `ComboboxOption[]` | | The options to choose from: a label, and optionally a description under it, a short meta value on the row's end (such as a time zone's offset), and a leading icon or element. |
679
679
  | `aria-label` | `string` | | The accessible name, for when there is no visible label. |
680
680
  | `className` | `string` | | Classes for the layout of the outer element: margin, width and placement, never its look. |
681
681
  | `createLabel` | `((label: string) => string)` | | The words of the offer to add what was typed; `Add “…”` by default. |
@@ -1241,6 +1241,23 @@ The row between a page's header and its list or table: pill tabs at the start, f
1241
1241
  | `size` | `"md" \| "inset"` | | By default `inset` in a settings column and `md` elsewhere. |
1242
1242
  | `tabs` | `ReactNode` | | Pill tabs at the start of the row (`PillTabs`). In a settings column their first label lines up with the title. |
1243
1243
 
1244
+ ## filter-toggle
1245
+
1246
+ `import { FilterToggle } from "@logicplanes/kaeso-ui/filter-toggle";`
1247
+
1248
+ - **size** (filter_toggle): `sm` (default) — 32px: beside small selects in toolbars and filter rows (default); `md` — 36px: beside default selects
1249
+
1250
+ ### FilterToggle
1251
+
1252
+ An on-or-off filter as a pill that sits in a row of selects: quiet like an unset select when off, a check and full text when on. Use it instead of a switch in filter rows and toolbars.
1253
+
1254
+ | Prop | Type | Default | Description |
1255
+ |---|---|---|---|
1256
+ | `label` * | `ReactNode` | | What the filter keeps, such as “Agents”. |
1257
+ | `onPressedChange` * | `(pressed: boolean) => void` | | Called with the new state when it is pressed. |
1258
+ | `pressed` * | `boolean` | | Whether the filter is on. |
1259
+ | `size` | `"md" \| "sm"` | `sm` | Its height, matched to the selects beside it. |
1260
+
1244
1261
  ## flow
1245
1262
 
1246
1263
  `import { Flow } from "@logicplanes/kaeso-ui/flow";`
@@ -1621,10 +1638,11 @@ A model: provider mark, display name, then its id in mono, capability icons with
1621
1638
  | `mark` | `boolean` | `true` | Shows the provider's mark first (default); turn it off in a list grouped under each provider's mark. |
1622
1639
  | `name` | `string` | | The display name, first. |
1623
1640
  | `providerName` | `string` | | The provider's name from the gateway's provider list, which names its mark for screen readers; the id without it. |
1641
+ | `stacked` | `boolean` | `false` | With a name, puts the model id on its own line under it, so neither is cut short; for rows tall enough for two lines. |
1624
1642
 
1625
1643
  ### ProviderBadge
1626
1644
 
1627
- A provider's mark on a quiet tile, in the provider's own one-colour version for the theme; for providers without one, the first letter of their name.
1645
+ A provider's mark on a quiet tile, in the provider's own colours for the theme, or the text colour for a mark its owner draws in black and white; for a provider without a mark, the first letter of its name.
1628
1646
 
1629
1647
  | Prop | Type | Default | Description |
1630
1648
  |---|---|---|---|
@@ -3051,8 +3069,8 @@ A plain table for small amounts of data; use `DataTable` for sorting, selection
3051
3069
 
3052
3070
  `import { PillTabs, Tabs } from "@logicplanes/kaeso-ui/tabs";`
3053
3071
 
3054
- - **variant** (pill_tabs): `underline` — Underline tabs for detail pages: 40px, labels 12px in like every box, a 2px ink indicator under the label that slides; `pill` (default) — Header tabs: separate 32px pills, the active one filled; the first pill's edge on the gutter
3055
- - **variant** (tabs): `underline` (default) — Underline tabs for detail pages: 40px, labels 12px in like every box, a 2px ink indicator under the label that slides; `pill` — Header tabs: separate 32px pills, the active one filled; the first pill's edge on the gutter
3072
+ - **variant** (pill_tabs): `underline` — 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; `pill` (default) — Header tabs: separate 32px pills, the active one filled; the first pill's edge on the gutter
3073
+ - **variant** (tabs): `underline` (default) — 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; `pill` — Header tabs: separate 32px pills, the active one filled; the first pill's edge on the gutter
3056
3074
 
3057
3075
  ### PillTabs
3058
3076
 
package/ai/icons.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Icon vocabulary
2
2
 
3
- Version 0.4.6. Generated from `src/icons/vocabulary.ts`; do not edit. Use the name, never an icon picked by look: `icons.key` always means a key. Hugeicons, Stroke Rounded. Rules: `foundations/icons.md`.
3
+ Version 0.4.8. Generated from `src/icons/vocabulary.ts`; do not edit. Use the name, never an icon picked by look: `icons.key` always means a key. Hugeicons, Stroke Rounded. Rules: `foundations/icons.md`.
4
4
 
5
5
  ## Kaeso objects
6
6
 
package/ai/tokens.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @logicplanes/kaeso-ui tokens
2
2
 
3
- Version 0.4.6. Generated from `@logicplanes/kaeso-tokens`; do not edit. Components use these through role names (`bg-panel`, `text-fg-secondary`, `h-36`, `rounded-pill`); a raw value never appears in a component. How to use them: `foundations/*.md`.
3
+ Version 0.4.8. Generated from `@logicplanes/kaeso-tokens`; do not edit. Components use these through role names (`bg-panel`, `text-fg-secondary`, `h-36`, `rounded-pill`); a raw value never appears in a component. How to use them: `foundations/*.md`.
4
4
 
5
5
  ## Neutrals
6
6
 
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { i as e } from "../chunks/context-BELWW79w.js";
3
- import { t } from "../chunks/dialog-2zb6ClNR.js";
3
+ import { t } from "../chunks/dialog-s3_LUPBi.js";
4
4
  import { forwardRef as n } from "react";
5
5
  import { jsx as r } from "react/jsx-runtime";
6
6
  //#region src/blocks/delete-resource/delete-resource.tsx
@@ -1,6 +1,6 @@
1
1
  "use client";
2
- import { t as e } from "../chunks/app-frame-DysOel2X.js";
3
- import { r as t } from "../chunks/page-header-kS5tdmvb.js";
2
+ import { t as e } from "../chunks/app-frame-D8sGcD0v.js";
3
+ import { r as t } from "../chunks/page-header-C5Bv1gKE.js";
4
4
  import { t as n } from "../chunks/empty-BpiUgGzm.js";
5
5
  import { a as r, t as i } from "../chunks/section-CFBYhsUi.js";
6
6
  import { Fragment as a, jsx as o, jsxs as s } from "react/jsx-runtime";
@@ -1,10 +1,10 @@
1
1
  "use client";
2
2
  import { i as e, r as t } from "../chunks/context-BELWW79w.js";
3
- import { n } from "../chunks/button-IblhXUyZ.js";
4
- import { o as r } from "../chunks/input-Bo5-UZg2.js";
3
+ import { n } from "../chunks/button-DrmFgdIi.js";
4
+ import { o as r } from "../chunks/input-D1SeLe3X.js";
5
5
  import { r as i } from "../chunks/toolbar-u0Gm7Q7-.js";
6
6
  import { t as a } from "../chunks/empty-BpiUgGzm.js";
7
- import { i as o, o as s } from "../chunks/list-B4G-sWwV.js";
7
+ import { i as o, o as s } from "../chunks/list-o8wcuBOz.js";
8
8
  import { forwardRef as c, useMemo as l, useState as u } from "react";
9
9
  import { jsx as d, jsxs as f } from "react/jsx-runtime";
10
10
  //#region src/blocks/resource-list/resource-list.tsx
@@ -4,9 +4,9 @@ import { t } from "./portal-context-CTatR2Z8.js";
4
4
  import { n, t as r } from "./inset-BUzyXLK4.js";
5
5
  import { i } from "./context-BELWW79w.js";
6
6
  import { l as a, s as o } from "./tooltip-Tkm-urbi.js";
7
- import { a as s } from "./button-IblhXUyZ.js";
8
- import { t as c } from "./icon-button-Dfwpvmav.js";
9
- import { l, t as u } from "./sidebar-Dq7oGOje.js";
7
+ import { a as s } from "./button-DrmFgdIi.js";
8
+ import { t as c } from "./icon-button-6kOn2zrP.js";
9
+ import { l, t as u } from "./sidebar-K30Ae8N5.js";
10
10
  import { t as d } from "./when-idle-Cy3pinqO.js";
11
11
  import { createContext as f, forwardRef as p, useCallback as m, useContext as h, useEffect as g, useId as _, useLayoutEffect as v, useMemo as y, useRef as b, useState as x } from "react";
12
12
  import { jsx as S, jsxs as C } from "react/jsx-runtime";
@@ -109,7 +109,7 @@ function j({ banner: e, href: t, label: n, actions: r, open: a, onToggle: o, tog
109
109
  });
110
110
  }
111
111
  process.env.NODE_ENV !== "production" && (j.displayName = "AppFrame.PhoneBar");
112
- var M = 750, N = 160, P = /* @__PURE__ */ o(() => import("./nav-sheet-Dt6JSvzX.js").then((e) => e.n), { base: () => import.meta.url });
112
+ var M = 750, N = 160, P = /* @__PURE__ */ o(() => import("./nav-sheet-D3U7MeaI.js").then((e) => e.n), { base: () => import.meta.url });
113
113
  function F({ navOpen: e, setNavOpen: t, toggle: n, ready: r, children: i }) {
114
114
  let { peeking: o, setPeeking: s } = l(), [c, u] = x(!1);
115
115
  g(() => d(() => u(!0)), []);
@@ -195,7 +195,7 @@ var V = /* @__PURE__ */ p(function({ title: t, description: i, actions: a, class
195
195
  ref: l,
196
196
  className: "relative",
197
197
  children: [/* @__PURE__ */ S(L, { className: "absolute top-10 left-24 z-10" }), /* @__PURE__ */ C("div", {
198
- className: e("mx-auto w-full max-w-settings px-24 pt-16 pb-96 lg:pt-64", o),
198
+ className: e("w-full px-24 pt-16 pb-96 lg:mx-auto lg:max-w-settings lg:pt-64", o),
199
199
  ...c,
200
200
  children: [/* @__PURE__ */ C("header", {
201
201
  className: "flex flex-wrap items-start justify-between gap-x-16 gap-y-8",
@@ -229,4 +229,4 @@ var H = /* @__PURE__ */ Object.assign(k, {
229
229
  //#endregion
230
230
  export { T as a, E as i, z as n, M as o, R as r, O as s, H as t };
231
231
 
232
- //# sourceMappingURL=app-frame-DysOel2X.js.map
232
+ //# sourceMappingURL=app-frame-D8sGcD0v.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"app-frame-DysOel2X.js","names":["__icon_SidebarLeftIcon","cn","GutterContent","useLazyModule","lazyModule","buttonClasses","IconButton","BrandWordmark","whenIdle","KAESO_APP_FRAME_VARIANTS","KAESO_APP_FRAME_DEFAULT_VARIANTS","Ctx","useAppFrame","useContext","Root","navOpen","setNavOpen","useState","toggle","useRef","sheetReady","mainId","useId","Main","fill","frame","useMemo","sheet","FrameSheet","sidebar","className","SkipLink","PhoneBar","brandHref","brandLabel","phoneActions","o","corner","PortalContainer","t","useUiText","target","main","Bar","banner","actions","toggleRef","SidebarLeftIcon","open","onToggle","PEEK_DELAY","PEEK_LEAVE","navSheet","n","useSidebar","idle","setIdle","dismiss","useCallback","setPeeking","NavSheet","peeking","pending","useLayoutEffect","usePendingDismiss","doc","onKeyDown","onPointerDown","MenuButton","intent","wide","collapsed","shortcut","setCollapsed","openNav","KAESO_APP_FRAME_BODY_VARIANTS","KAESO_APP_FRAME_BODY_DEFAULT_VARIANTS","Body","props","padding","Settings","title","description","InsetContent","AppFrame"],"sources":["../../src/components/app-frame/app-frame.tsx"],"sourcesContent":["import {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useId,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactNode,\n type RefObject,\n} from \"react\";\nimport { GutterContent, InsetContent } from \"../../utils/inset.js\";\nimport { cn } from \"../../utils/cn.js\";\nimport { SidebarLeftIcon as __icon_SidebarLeftIcon } from \"@hugeicons/core-free-icons\";\nimport { IconButton } from \"../icon-button/icon-button.js\";\nimport { buttonClasses } from \"../button/button.js\";\nimport { useSidebar, BrandWordmark } from \"../sidebar/sidebar.js\";\nimport { PortalContainer } from \"../../utils/portal-context.js\";\nimport { lazyModule, useLazyModule } from \"../../utils/lazy-module.js\";\nimport { whenIdle } from \"../../utils/when-idle.js\";\nimport { useUiText } from \"../../i18n/context.js\";\n\nexport const KAESO_APP_FRAME_VARIANTS = {\n fill: {\n screen: { classes: \"h-dvh\" },\n parent: { classes: \"h-full\" },\n },\n} as const;\nexport const KAESO_APP_FRAME_DEFAULT_VARIANTS = { fill: \"screen\" } as const;\n\nconst Ctx = /* @__PURE__ */ createContext<{ openNav: () => void; embedded: boolean; sheetReady: RefObject<boolean> }>({\n openNav: () => undefined,\n embedded: false,\n sheetReady: { current: false },\n});\nexport const useAppFrame = () => useContext(Ctx);\n\nexport interface AppFrameProps {\n sidebar: ReactNode;\n children: ReactNode;\n corner?: ReactNode | undefined;\n fill?: keyof typeof KAESO_APP_FRAME_VARIANTS.fill | undefined;\n brandHref?: string | undefined;\n brandLabel?: string | undefined;\n phoneActions?: ReactNode | undefined;\n className?: string | undefined;\n}\n\nconst Root = /* @__PURE__ */ forwardRef<HTMLDivElement, AppFrameProps>(function AppFrame(\n { sidebar, children, corner, fill = \"screen\", brandHref, brandLabel, phoneActions, className },\n ref,\n) {\n const [navOpen, setNavOpen] = useState(false);\n const toggle = useRef<HTMLButtonElement | null>(null);\n const sheetReady = useRef(false);\n const mainId = `k-main-${useId().replace(/[^\\w-]/g, \"\")}`;\n const Main = fill === \"screen\" ? \"main\" : \"div\";\n const frame = useMemo(() => ({ openNav: () => setNavOpen(true), embedded: fill === \"parent\", sheetReady }), [fill]);\n const sheet = (\n <FrameSheet navOpen={navOpen} setNavOpen={setNavOpen} toggle={toggle} ready={sheetReady}>\n {sidebar}\n </FrameSheet>\n );\n return (\n <Ctx.Provider value={frame}>\n <div\n ref={ref}\n data-app-frame={fill}\n className={cn(\n \"relative isolate flex w-full flex-col overflow-hidden bg-chrome text-fg lg:flex-row\",\n KAESO_APP_FRAME_VARIANTS.fill[fill].classes,\n className,\n )}\n >\n <SkipLink target={mainId} />\n <div className=\"hidden h-full lg:flex\">{sidebar}</div>\n <PhoneBar\n banner={fill === \"screen\"}\n href={brandHref}\n label={brandLabel}\n actions={phoneActions}\n open={navOpen}\n onToggle={() => setNavOpen((o) => !o)}\n toggleRef={toggle}\n />\n <Main\n id={mainId}\n className=\"relative flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden bg-panel outline-none safe-area-panel lg:my-8 lg:mr-8 lg:rounded-panel lg:shadow-panel\"\n >\n {children}\n </Main>\n {corner && <div className={cn(fill === \"parent\" ? \"absolute\" : \"fixed\", \"right-16 bottom-16 z-10 flex items-center gap-8\")}>{corner}</div>}\n {fill === \"parent\" ? <PortalContainer className=\"contents\">{sheet}</PortalContainer> : sheet}\n </div>\n </Ctx.Provider>\n );\n});\nif (process.env.NODE_ENV !== \"production\") Root.displayName = \"AppFrame\";\n\nfunction SkipLink({ target }: { target: string }) {\n const t = useUiText();\n return (\n <a\n href={`#${target}`}\n onClick={(e) => {\n const main = document.getElementById(target);\n if (!main) return;\n e.preventDefault();\n main.setAttribute(\"tabindex\", \"-1\");\n main.addEventListener(\"blur\", () => main.removeAttribute(\"tabindex\"), { once: true });\n main.focus();\n }}\n className={cn(buttonClasses({ size: \"sm\" }), \"absolute top-16 left-16 z-50 not-focus:sr-only\")}\n >\n {t(\"appFrame.skipToContent\", \"Skip to content\")}\n </a>\n );\n}\nif (process.env.NODE_ENV !== \"production\") SkipLink.displayName = \"AppFrame.SkipLink\";\n\nfunction PhoneBar({\n banner,\n href,\n label,\n actions,\n open,\n onToggle,\n toggleRef,\n}: {\n banner: boolean;\n href: string | undefined;\n label: string | undefined;\n actions: ReactNode;\n open: boolean;\n onToggle: () => void;\n toggleRef: RefObject<HTMLButtonElement | null>;\n}) {\n const Bar = banner ? \"header\" : \"div\";\n const t = useUiText();\n return (\n <Bar data-phone-bar=\"\" className=\"shrink-0 bg-panel safe-area-bar lg:hidden\">\n <div className=\"mt-8 flex h-52 items-center justify-between px-24\">\n <BrandWordmark href={href} label={label} />\n <span className=\"flex items-center\">\n {actions}\n <IconButton\n ref={toggleRef}\n icon={__icon_SidebarLeftIcon}\n aria-label={t(\"appFrame.openNavigation\", \"Open navigation\")}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n tooltip={false}\n onClick={onToggle}\n />\n </span>\n </div>\n </Bar>\n );\n}\nif (process.env.NODE_ENV !== \"production\") PhoneBar.displayName = \"AppFrame.PhoneBar\";\n\nexport const PEEK_DELAY = 750;\nconst PEEK_LEAVE = 160;\n\nconst navSheet = /* @__PURE__ */ lazyModule(() => import(\"./nav-sheet.js\"), { base: () => import.meta.url });\n\nfunction FrameSheet({\n navOpen,\n setNavOpen,\n toggle,\n ready,\n children,\n}: {\n navOpen: boolean;\n setNavOpen: (o: boolean) => void;\n toggle: RefObject<HTMLElement | null>;\n ready: RefObject<boolean>;\n children: ReactNode;\n}) {\n const { peeking, setPeeking } = useSidebar();\n const [idle, setIdle] = useState(false);\n useEffect(() => whenIdle(() => setIdle(true)), []);\n const dismiss = useCallback(() => {\n setNavOpen(false);\n setPeeking(false);\n }, [setNavOpen, setPeeking]);\n const NavSheet = useLazyModule(navSheet, idle || navOpen || peeking, () => {\n setIdle(false);\n dismiss();\n })?.NavSheet;\n const pending = (navOpen || peeking) && !NavSheet;\n useLayoutEffect(() => {\n ready.current = !!NavSheet;\n });\n usePendingDismiss(pending, toggle, dismiss);\n if (!NavSheet) return null;\n return (\n <NavSheet\n open={navOpen || peeking}\n peek={peeking && !navOpen}\n {...(navOpen ? { returnFocus: toggle } : {})}\n onOpenChange={(o) => {\n if (!o) dismiss();\n }}\n >\n {children}\n </NavSheet>\n );\n}\n\nfunction usePendingDismiss(pending: boolean, toggle: RefObject<HTMLElement | null>, dismiss: () => void) {\n useEffect(() => {\n if (!pending) return;\n const doc = toggle.current?.ownerDocument ?? document;\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key !== \"Escape\") return;\n e.stopPropagation();\n dismiss();\n };\n const onPointerDown = (e: PointerEvent) => {\n if (!toggle.current?.contains(e.target as Node)) dismiss();\n };\n doc.addEventListener(\"keydown\", onKeyDown, true);\n doc.addEventListener(\"pointerdown\", onPointerDown, true);\n return () => {\n doc.removeEventListener(\"keydown\", onKeyDown, true);\n doc.removeEventListener(\"pointerdown\", onPointerDown, true);\n };\n }, [pending, toggle, dismiss]);\n}\n\nconst MenuButton = /* @__PURE__ */ forwardRef<HTMLButtonElement, { className?: string | undefined }>(function AppFrameMenuButton({ className }, ref) {\n const { openNav, sheetReady } = useAppFrame();\n const { collapsed, setCollapsed, peeking, setPeeking, shortcut } = useSidebar();\n const intent = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n useEffect(() => () => clearTimeout(intent.current), []);\n const t = useUiText();\n const wide = () => typeof window !== \"undefined\" && window.matchMedia(\"(min-width: 1024px)\").matches;\n return (\n <IconButton\n ref={ref}\n onPointerEnter={() => {\n clearTimeout(intent.current);\n if (collapsed && wide() && !peeking) intent.current = setTimeout(() => setPeeking(true), PEEK_DELAY);\n }}\n onPointerLeave={(e) => {\n clearTimeout(intent.current);\n if (!sheetReady.current || !peeking) return setPeeking(false);\n const doc = e.currentTarget.ownerDocument;\n intent.current = setTimeout(() => {\n if (!doc.querySelector(\"[data-nav-sheet]\")?.matches(\":hover\")) setPeeking(false);\n }, PEEK_LEAVE);\n }}\n icon={__icon_SidebarLeftIcon}\n data-sidebar-expand=\"\"\n aria-label={collapsed ? t(\"appFrame.expandSidebar\", \"Expand sidebar\") : t(\"appFrame.openNavigation\", \"Open navigation\")}\n shortcut={collapsed && shortcut ? [\"[\"] : undefined}\n onClick={() => {\n clearTimeout(intent.current);\n if (collapsed && wide()) setCollapsed(false);\n else openNav();\n }}\n className={cn(\"hidden\", collapsed && \"lg:inline-flex\", className)}\n />\n );\n});\nif (process.env.NODE_ENV !== \"production\") MenuButton.displayName = \"AppFrame.MenuButton\";\n\nexport const KAESO_APP_FRAME_BODY_VARIANTS = {\n padding: {\n none: { classes: \"\" },\n list: { classes: \"pt-8 pb-24\" },\n page: { classes: \"px-24 pt-16 pb-48\" },\n },\n} as const;\nexport const KAESO_APP_FRAME_BODY_DEFAULT_VARIANTS = { padding: \"none\" } as const;\n\nexport interface AppFrameBodyProps extends HTMLAttributes<HTMLDivElement> {\n padding?: keyof typeof KAESO_APP_FRAME_BODY_VARIANTS.padding | undefined;\n}\n\nconst Body = /* @__PURE__ */ forwardRef<HTMLDivElement, AppFrameBodyProps>(function AppFrameBody({ className, padding = \"none\", children, ...props }, ref) {\n return (\n <div\n ref={ref}\n className={cn(\"min-h-0 flex-1 overflow-y-auto overscroll-contain scrollbar-quiet\", KAESO_APP_FRAME_BODY_VARIANTS.padding[padding].classes, className)}\n {...props}\n >\n <GutterContent padded={padding === \"page\"}>{children}</GutterContent>\n </div>\n );\n});\nif (process.env.NODE_ENV !== \"production\") Body.displayName = \"AppFrame.Body\";\n\nexport interface SettingsPageProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n title: ReactNode;\n description?: ReactNode | undefined;\n actions?: ReactNode | undefined;\n}\n\nconst Settings = /* @__PURE__ */ forwardRef<HTMLDivElement, SettingsPageProps>(function AppFrameSettings({ title, description, actions, className, children, ...props }, ref) {\n return (\n <Body ref={ref} className=\"relative\">\n <MenuButton className=\"absolute top-10 left-24 z-10\" />\n <div className={cn(\"mx-auto w-full max-w-settings px-24 pt-16 pb-96 lg:pt-64\", className)} {...props}>\n <header className=\"flex flex-wrap items-start justify-between gap-x-16 gap-y-8\">\n <h1 className=\"min-w-0 text-title-lg font-semibold text-fg text-balance\">{title}</h1>\n {actions && <div className=\"order-last flex h-34 shrink-0 items-center gap-8 sm:order-none sm:ml-auto\">{actions}</div>}\n {description && <p className=\"basis-full text-body-lg font-regular text-fg-secondary\">{description}</p>}\n </header>\n <div className=\"mt-8\">\n <InsetContent>\n <GutterContent>{children}</GutterContent>\n </InsetContent>\n </div>\n </div>\n </Body>\n );\n});\nif (process.env.NODE_ENV !== \"production\") Settings.displayName = \"AppFrame.Settings\";\n\nexport const AppFrame = /* @__PURE__ */ Object.assign(Root, { MenuButton, Body, Settings });\n"],"mappings":"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"}
1
+ {"version":3,"file":"app-frame-D8sGcD0v.js","names":["__icon_SidebarLeftIcon","cn","GutterContent","useLazyModule","lazyModule","buttonClasses","IconButton","BrandWordmark","whenIdle","KAESO_APP_FRAME_VARIANTS","KAESO_APP_FRAME_DEFAULT_VARIANTS","Ctx","useAppFrame","useContext","Root","navOpen","setNavOpen","useState","toggle","useRef","sheetReady","mainId","useId","Main","fill","frame","useMemo","sheet","FrameSheet","sidebar","className","SkipLink","PhoneBar","brandHref","brandLabel","phoneActions","o","corner","PortalContainer","t","useUiText","target","main","Bar","banner","actions","toggleRef","SidebarLeftIcon","open","onToggle","PEEK_DELAY","PEEK_LEAVE","navSheet","n","useSidebar","idle","setIdle","dismiss","useCallback","setPeeking","NavSheet","peeking","pending","useLayoutEffect","usePendingDismiss","doc","onKeyDown","onPointerDown","MenuButton","intent","wide","collapsed","shortcut","setCollapsed","openNav","KAESO_APP_FRAME_BODY_VARIANTS","KAESO_APP_FRAME_BODY_DEFAULT_VARIANTS","Body","props","padding","Settings","title","description","InsetContent","AppFrame"],"sources":["../../src/components/app-frame/app-frame.tsx"],"sourcesContent":["import {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useId,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactNode,\n type RefObject,\n} from \"react\";\nimport { GutterContent, InsetContent } from \"../../utils/inset.js\";\nimport { cn } from \"../../utils/cn.js\";\nimport { SidebarLeftIcon as __icon_SidebarLeftIcon } from \"@hugeicons/core-free-icons\";\nimport { IconButton } from \"../icon-button/icon-button.js\";\nimport { buttonClasses } from \"../button/button.js\";\nimport { useSidebar, BrandWordmark } from \"../sidebar/sidebar.js\";\nimport { PortalContainer } from \"../../utils/portal-context.js\";\nimport { lazyModule, useLazyModule } from \"../../utils/lazy-module.js\";\nimport { whenIdle } from \"../../utils/when-idle.js\";\nimport { useUiText } from \"../../i18n/context.js\";\n\nexport const KAESO_APP_FRAME_VARIANTS = {\n fill: {\n screen: { classes: \"h-dvh\" },\n parent: { classes: \"h-full\" },\n },\n} as const;\nexport const KAESO_APP_FRAME_DEFAULT_VARIANTS = { fill: \"screen\" } as const;\n\nconst Ctx = /* @__PURE__ */ createContext<{ openNav: () => void; embedded: boolean; sheetReady: RefObject<boolean> }>({\n openNav: () => undefined,\n embedded: false,\n sheetReady: { current: false },\n});\nexport const useAppFrame = () => useContext(Ctx);\n\nexport interface AppFrameProps {\n sidebar: ReactNode;\n children: ReactNode;\n corner?: ReactNode | undefined;\n fill?: keyof typeof KAESO_APP_FRAME_VARIANTS.fill | undefined;\n brandHref?: string | undefined;\n brandLabel?: string | undefined;\n phoneActions?: ReactNode | undefined;\n className?: string | undefined;\n}\n\nconst Root = /* @__PURE__ */ forwardRef<HTMLDivElement, AppFrameProps>(function AppFrame(\n { sidebar, children, corner, fill = \"screen\", brandHref, brandLabel, phoneActions, className },\n ref,\n) {\n const [navOpen, setNavOpen] = useState(false);\n const toggle = useRef<HTMLButtonElement | null>(null);\n const sheetReady = useRef(false);\n const mainId = `k-main-${useId().replace(/[^\\w-]/g, \"\")}`;\n const Main = fill === \"screen\" ? \"main\" : \"div\";\n const frame = useMemo(() => ({ openNav: () => setNavOpen(true), embedded: fill === \"parent\", sheetReady }), [fill]);\n const sheet = (\n <FrameSheet navOpen={navOpen} setNavOpen={setNavOpen} toggle={toggle} ready={sheetReady}>\n {sidebar}\n </FrameSheet>\n );\n return (\n <Ctx.Provider value={frame}>\n <div\n ref={ref}\n data-app-frame={fill}\n className={cn(\n \"relative isolate flex w-full flex-col overflow-hidden bg-chrome text-fg lg:flex-row\",\n KAESO_APP_FRAME_VARIANTS.fill[fill].classes,\n className,\n )}\n >\n <SkipLink target={mainId} />\n <div className=\"hidden h-full lg:flex\">{sidebar}</div>\n <PhoneBar\n banner={fill === \"screen\"}\n href={brandHref}\n label={brandLabel}\n actions={phoneActions}\n open={navOpen}\n onToggle={() => setNavOpen((o) => !o)}\n toggleRef={toggle}\n />\n <Main\n id={mainId}\n className=\"relative flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden bg-panel outline-none safe-area-panel lg:my-8 lg:mr-8 lg:rounded-panel lg:shadow-panel\"\n >\n {children}\n </Main>\n {corner && <div className={cn(fill === \"parent\" ? \"absolute\" : \"fixed\", \"right-16 bottom-16 z-10 flex items-center gap-8\")}>{corner}</div>}\n {fill === \"parent\" ? <PortalContainer className=\"contents\">{sheet}</PortalContainer> : sheet}\n </div>\n </Ctx.Provider>\n );\n});\nif (process.env.NODE_ENV !== \"production\") Root.displayName = \"AppFrame\";\n\nfunction SkipLink({ target }: { target: string }) {\n const t = useUiText();\n return (\n <a\n href={`#${target}`}\n onClick={(e) => {\n const main = document.getElementById(target);\n if (!main) return;\n e.preventDefault();\n main.setAttribute(\"tabindex\", \"-1\");\n main.addEventListener(\"blur\", () => main.removeAttribute(\"tabindex\"), { once: true });\n main.focus();\n }}\n className={cn(buttonClasses({ size: \"sm\" }), \"absolute top-16 left-16 z-50 not-focus:sr-only\")}\n >\n {t(\"appFrame.skipToContent\", \"Skip to content\")}\n </a>\n );\n}\nif (process.env.NODE_ENV !== \"production\") SkipLink.displayName = \"AppFrame.SkipLink\";\n\nfunction PhoneBar({\n banner,\n href,\n label,\n actions,\n open,\n onToggle,\n toggleRef,\n}: {\n banner: boolean;\n href: string | undefined;\n label: string | undefined;\n actions: ReactNode;\n open: boolean;\n onToggle: () => void;\n toggleRef: RefObject<HTMLButtonElement | null>;\n}) {\n const Bar = banner ? \"header\" : \"div\";\n const t = useUiText();\n return (\n <Bar data-phone-bar=\"\" className=\"shrink-0 bg-panel safe-area-bar lg:hidden\">\n <div className=\"mt-8 flex h-52 items-center justify-between px-24\">\n <BrandWordmark href={href} label={label} />\n <span className=\"flex items-center\">\n {actions}\n <IconButton\n ref={toggleRef}\n icon={__icon_SidebarLeftIcon}\n aria-label={t(\"appFrame.openNavigation\", \"Open navigation\")}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n tooltip={false}\n onClick={onToggle}\n />\n </span>\n </div>\n </Bar>\n );\n}\nif (process.env.NODE_ENV !== \"production\") PhoneBar.displayName = \"AppFrame.PhoneBar\";\n\nexport const PEEK_DELAY = 750;\nconst PEEK_LEAVE = 160;\n\nconst navSheet = /* @__PURE__ */ lazyModule(() => import(\"./nav-sheet.js\"), { base: () => import.meta.url });\n\nfunction FrameSheet({\n navOpen,\n setNavOpen,\n toggle,\n ready,\n children,\n}: {\n navOpen: boolean;\n setNavOpen: (o: boolean) => void;\n toggle: RefObject<HTMLElement | null>;\n ready: RefObject<boolean>;\n children: ReactNode;\n}) {\n const { peeking, setPeeking } = useSidebar();\n const [idle, setIdle] = useState(false);\n useEffect(() => whenIdle(() => setIdle(true)), []);\n const dismiss = useCallback(() => {\n setNavOpen(false);\n setPeeking(false);\n }, [setNavOpen, setPeeking]);\n const NavSheet = useLazyModule(navSheet, idle || navOpen || peeking, () => {\n setIdle(false);\n dismiss();\n })?.NavSheet;\n const pending = (navOpen || peeking) && !NavSheet;\n useLayoutEffect(() => {\n ready.current = !!NavSheet;\n });\n usePendingDismiss(pending, toggle, dismiss);\n if (!NavSheet) return null;\n return (\n <NavSheet\n open={navOpen || peeking}\n peek={peeking && !navOpen}\n {...(navOpen ? { returnFocus: toggle } : {})}\n onOpenChange={(o) => {\n if (!o) dismiss();\n }}\n >\n {children}\n </NavSheet>\n );\n}\n\nfunction usePendingDismiss(pending: boolean, toggle: RefObject<HTMLElement | null>, dismiss: () => void) {\n useEffect(() => {\n if (!pending) return;\n const doc = toggle.current?.ownerDocument ?? document;\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key !== \"Escape\") return;\n e.stopPropagation();\n dismiss();\n };\n const onPointerDown = (e: PointerEvent) => {\n if (!toggle.current?.contains(e.target as Node)) dismiss();\n };\n doc.addEventListener(\"keydown\", onKeyDown, true);\n doc.addEventListener(\"pointerdown\", onPointerDown, true);\n return () => {\n doc.removeEventListener(\"keydown\", onKeyDown, true);\n doc.removeEventListener(\"pointerdown\", onPointerDown, true);\n };\n }, [pending, toggle, dismiss]);\n}\n\nconst MenuButton = /* @__PURE__ */ forwardRef<HTMLButtonElement, { className?: string | undefined }>(function AppFrameMenuButton({ className }, ref) {\n const { openNav, sheetReady } = useAppFrame();\n const { collapsed, setCollapsed, peeking, setPeeking, shortcut } = useSidebar();\n const intent = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n useEffect(() => () => clearTimeout(intent.current), []);\n const t = useUiText();\n const wide = () => typeof window !== \"undefined\" && window.matchMedia(\"(min-width: 1024px)\").matches;\n return (\n <IconButton\n ref={ref}\n onPointerEnter={() => {\n clearTimeout(intent.current);\n if (collapsed && wide() && !peeking) intent.current = setTimeout(() => setPeeking(true), PEEK_DELAY);\n }}\n onPointerLeave={(e) => {\n clearTimeout(intent.current);\n if (!sheetReady.current || !peeking) return setPeeking(false);\n const doc = e.currentTarget.ownerDocument;\n intent.current = setTimeout(() => {\n if (!doc.querySelector(\"[data-nav-sheet]\")?.matches(\":hover\")) setPeeking(false);\n }, PEEK_LEAVE);\n }}\n icon={__icon_SidebarLeftIcon}\n data-sidebar-expand=\"\"\n aria-label={collapsed ? t(\"appFrame.expandSidebar\", \"Expand sidebar\") : t(\"appFrame.openNavigation\", \"Open navigation\")}\n shortcut={collapsed && shortcut ? [\"[\"] : undefined}\n onClick={() => {\n clearTimeout(intent.current);\n if (collapsed && wide()) setCollapsed(false);\n else openNav();\n }}\n className={cn(\"hidden\", collapsed && \"lg:inline-flex\", className)}\n />\n );\n});\nif (process.env.NODE_ENV !== \"production\") MenuButton.displayName = \"AppFrame.MenuButton\";\n\nexport const KAESO_APP_FRAME_BODY_VARIANTS = {\n padding: {\n none: { classes: \"\" },\n list: { classes: \"pt-8 pb-24\" },\n page: { classes: \"px-24 pt-16 pb-48\" },\n },\n} as const;\nexport const KAESO_APP_FRAME_BODY_DEFAULT_VARIANTS = { padding: \"none\" } as const;\n\nexport interface AppFrameBodyProps extends HTMLAttributes<HTMLDivElement> {\n padding?: keyof typeof KAESO_APP_FRAME_BODY_VARIANTS.padding | undefined;\n}\n\nconst Body = /* @__PURE__ */ forwardRef<HTMLDivElement, AppFrameBodyProps>(function AppFrameBody({ className, padding = \"none\", children, ...props }, ref) {\n return (\n <div\n ref={ref}\n className={cn(\"min-h-0 flex-1 overflow-y-auto overscroll-contain scrollbar-quiet\", KAESO_APP_FRAME_BODY_VARIANTS.padding[padding].classes, className)}\n {...props}\n >\n <GutterContent padded={padding === \"page\"}>{children}</GutterContent>\n </div>\n );\n});\nif (process.env.NODE_ENV !== \"production\") Body.displayName = \"AppFrame.Body\";\n\nexport interface SettingsPageProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n title: ReactNode;\n description?: ReactNode | undefined;\n actions?: ReactNode | undefined;\n}\n\nconst Settings = /* @__PURE__ */ forwardRef<HTMLDivElement, SettingsPageProps>(function AppFrameSettings({ title, description, actions, className, children, ...props }, ref) {\n return (\n <Body ref={ref} className=\"relative\">\n <MenuButton className=\"absolute top-10 left-24 z-10\" />\n <div className={cn(\"w-full px-24 pt-16 pb-96 lg:mx-auto lg:max-w-settings lg:pt-64\", className)} {...props}>\n <header className=\"flex flex-wrap items-start justify-between gap-x-16 gap-y-8\">\n <h1 className=\"min-w-0 text-title-lg font-semibold text-fg text-balance\">{title}</h1>\n {actions && <div className=\"order-last flex h-34 shrink-0 items-center gap-8 sm:order-none sm:ml-auto\">{actions}</div>}\n {description && <p className=\"basis-full text-body-lg font-regular text-fg-secondary\">{description}</p>}\n </header>\n <div className=\"mt-8\">\n <InsetContent>\n <GutterContent>{children}</GutterContent>\n </InsetContent>\n </div>\n </div>\n </Body>\n );\n});\nif (process.env.NODE_ENV !== \"production\") Settings.displayName = \"AppFrame.Settings\";\n\nexport const AppFrame = /* @__PURE__ */ Object.assign(Root, { MenuButton, Body, Settings });\n"],"mappings":"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"}
@@ -3,7 +3,7 @@ import { t as e } from "./cn-BjnOAUrA.js";
3
3
  import { t } from "./dev-CR1p7gCm.js";
4
4
  import { i as n } from "./context-BELWW79w.js";
5
5
  import { t as r } from "./icon-CBzOwqrX.js";
6
- import { t as i } from "./icon-button-Dfwpvmav.js";
6
+ import { t as i } from "./icon-button-6kOn2zrP.js";
7
7
  import { forwardRef as a, useState as o } from "react";
8
8
  import { jsx as s, jsxs as c } from "react/jsx-runtime";
9
9
  import { Alert02Icon as l, AlertCircleIcon as u, Cancel01Icon as d, CheckmarkCircle02Icon as f, InformationCircleIcon as p } from "@hugeicons/core-free-icons";
@@ -85,4 +85,4 @@ process.env.NODE_ENV !== "production" && (v.displayName = "Banner");
85
85
  //#endregion
86
86
  export { h as n, m as r, v as t };
87
87
 
88
- //# sourceMappingURL=banner-B3DGLTBu.js.map
88
+ //# sourceMappingURL=banner-BinTH032.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"banner-B3DGLTBu.js","names":["__icon_InformationCircleIcon","__icon_CheckmarkCircle02Icon","__icon_Alert02Icon","__icon_AlertCircleIcon","__icon_Cancel01Icon","cn","useUiText","Icon","IconButton","KAESO_BANNER_VARIANTS","KAESO_BANNER_DEFAULT_VARIANTS","ICON","InformationCircleIcon","CheckmarkCircle02Icon","Alert02Icon","AlertCircleIcon","ICON_TONE","Banner","hidden","setHidden","useState","t","dismissible","onDismiss","tone","devWarn","mark","icon","layout","className","actions","title","children","Cancel01Icon"],"sources":["../../src/components/banner/banner.tsx"],"sourcesContent":["import { forwardRef, useState, type ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn.js\";\nimport { InformationCircleIcon as __icon_InformationCircleIcon, CheckmarkCircle02Icon as __icon_CheckmarkCircle02Icon, Alert02Icon as __icon_Alert02Icon, AlertCircleIcon as __icon_AlertCircleIcon, Cancel01Icon as __icon_Cancel01Icon } from \"@hugeicons/core-free-icons\";\nimport { Icon, type IconData } from \"../icon/icon.js\";\nimport { IconButton } from \"../icon-button/icon-button.js\";\nimport { useUiText } from \"../../i18n/context.js\";\nimport { devWarn } from \"../../utils/dev.js\";\n\nexport const KAESO_BANNER_VARIANTS = {\n tone: {\n neutral: { classes: \"bg-fill-1 text-fg\" },\n info: { classes: \"bg-info-tint text-fg\" },\n success: { classes: \"bg-success-tint text-fg\" },\n warning: { classes: \"bg-warning-tint text-fg\" },\n danger: { classes: \"bg-danger-tint text-fg\" },\n },\n layout: {\n inline: {\n classes: \"flex min-h-56 flex-col justify-center rounded-well px-12 py-12\",\n },\n full: { classes: \"rounded-none px-24 py-10\" },\n },\n} as const;\nexport const KAESO_BANNER_DEFAULT_VARIANTS = { tone: \"neutral\", layout: \"inline\" } as const;\n\nconst ICON: Record<keyof typeof KAESO_BANNER_VARIANTS.tone, IconData | undefined> = {\n neutral: undefined,\n info: __icon_InformationCircleIcon,\n success: __icon_CheckmarkCircle02Icon,\n warning: __icon_Alert02Icon,\n danger: __icon_AlertCircleIcon,\n};\nconst ICON_TONE = {\n neutral: \"text-fg-secondary\",\n info: \"text-info-text\",\n success: \"text-success-text\",\n warning: \"text-warning-text\",\n danger: \"text-danger-text\",\n} as const;\n\nexport interface BannerProps {\n tone?: keyof typeof KAESO_BANNER_VARIANTS.tone | undefined;\n layout?: keyof typeof KAESO_BANNER_VARIANTS.layout | undefined;\n title?: ReactNode | undefined;\n children?: ReactNode | undefined;\n icon?: IconData | undefined;\n actions?: ReactNode | undefined;\n onDismiss?: (() => void) | undefined;\n className?: string | undefined;\n}\n\nexport const Banner = /* @__PURE__ */ forwardRef<HTMLDivElement, BannerProps>(function Banner(\n { tone = \"neutral\", layout = \"inline\", title, children, icon, actions, onDismiss, className },\n ref,\n) {\n const [hidden, setHidden] = useState(false);\n const t = useUiText();\n if (hidden) return null;\n const dismissible = onDismiss && (tone === \"neutral\" || tone === \"info\");\n if (onDismiss && !dismissible) devWarn(`Banner: a ${tone} banner can't be dismissed; it stays until its cause is fixed, so onDismiss is ignored.`);\n const mark = icon ?? ICON[tone];\n return (\n <div\n ref={ref}\n role={tone === \"danger\" ? \"alert\" : \"status\"}\n className={cn(\n \"@container w-full forced-colors:outline forced-colors:-outline-offset-1\",\n KAESO_BANNER_VARIANTS.tone[tone].classes,\n KAESO_BANNER_VARIANTS.layout[layout].classes,\n className,\n )}\n >\n <div className={cn(\"flex items-start gap-8\", actions && \"@banner:items-center\")}>\n <div className=\"flex min-w-0 flex-1 flex-col gap-12 @banner:flex-row @banner:items-center @banner:gap-24\">\n <div className=\"flex min-w-0 flex-1 items-start gap-8\">\n {mark && <Icon icon={mark} size=\"sm\" className={cn(\"mt-2\", ICON_TONE[tone])} />}\n <div className=\"flex min-w-0 flex-1 flex-col gap-2 text-body\">\n {title && <span className=\"font-semibold text-fg\">{title}</span>}\n {children && <div className=\"text-fg text-pretty\">{children}</div>}\n </div>\n </div>\n {actions && <div className={cn(\"flex shrink-0 flex-wrap items-center gap-8 @banner:ml-0\", mark && \"ml-24\")}>{actions}</div>}\n </div>\n {dismissible && (\n <IconButton\n icon={__icon_Cancel01Icon}\n aria-label={t(\"banner.dismiss\", \"Dismiss\")}\n size=\"xs\"\n className=\"-my-2 -mr-6 hover:bg-fill-2 active:bg-fill-3\"\n onClick={() => {\n setHidden(true);\n onDismiss?.();\n }}\n />\n )}\n </div>\n </div>\n );\n});\nif (process.env.NODE_ENV !== \"production\") Banner.displayName = \"Banner\";\n"],"mappings":";;;;;;;;;;AAQA,IAAaS,IAAwB;CACnC,MAAM;EACJ,SAAS,EAAE,SAAS,oBAAoB;EACxC,MAAM,EAAE,SAAS,uBAAuB;EACxC,SAAS,EAAE,SAAS,0BAA0B;EAC9C,SAAS,EAAE,SAAS,0BAA0B;EAC9C,QAAQ,EAAE,SAAS,yBAAyB;CAC9C;CACA,QAAQ;EACN,QAAQ,EACN,SAAS,iEACX;EACA,MAAM,EAAE,SAAS,2BAA2B;CAC9C;AACF,GACaC,IAAgC;CAAE,MAAM;CAAW,QAAQ;AAAS,GAE3EC,IAA8E;CAClF,SAAS,KAAA;CACT,MAAMX;CACN,SAASC;CACT,SAASC;CACT,QAAQC;AACV,GACMa,IAAY;CAChB,SAAS;CACT,MAAM;CACN,SAAS;CACT,SAAS;CACT,QAAQ;AACV,GAaaC,IAAyB,kBAAwC,SAC5E,EAAE,UAAO,WAAW,YAAS,UAAU,UAAO,aAAU,SAAM,YAAS,cAAW,gBAClF,GACA;CACA,IAAM,CAACC,GAAQC,KAAaC,EAAS,EAAK,GACpCC,IAAIf,EAAU;CACpB,IAAIY,GAAQ,OAAO;CACnB,IAAMI,IAAcC,MAAcC,MAAS,aAAaA,MAAS;CACjE,AAAID,KAAa,CAACD,KAAaG,EAAQ,aAAaD,EAAK,wFAAwF;CACjJ,IAAME,IAAOC,KAAQhB,EAAKa;CAC1B,OACE,kBAAC,OAAD;EACO;EACL,MAAMA,MAAS,WAAW,UAAU;EACpC,WAAWnB,EACT,2EACAI,EAAsB,KAAKe,EAAK,CAAC,SACjCf,EAAsB,OAAOmB,EAAO,CAAC,SACrCC,CACF;EAEA,UAAA,kBAAC,OAAD;GAAK,WAAWxB,EAAG,0BAA0ByB,KAAW,sBAAsB;GAA9E,UAAA,CACE,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACGJ,KAAQ,kBAACnB,GAAD;MAAM,MAAMmB;MAAM,MAAK;MAAK,WAAWrB,EAAG,QAAQW,EAAUQ,EAAK;KAAI,CAAA,GAC9E,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACGO,KAAS,kBAAC,QAAD;OAAM,WAAU;OAAyB,UAAAA;MAAY,CAAA,GAC9DC,KAAY,kBAAC,OAAD;OAAK,WAAU;OAAuB;MAAc,CAAA,CAC9D;KACF,CAAA,CAAA;IACJ,CAAA,GAAAF,KAAW,kBAAC,OAAD;KAAK,WAAWzB,EAAG,2DAA2DqB,KAAQ,OAAO;KAAI,UAAAI;IAAa,CAAA,CACvH;GACJ,CAAA,GAAAR,KACC,kBAACd,GAAD;IACE,MAAMJ;IACN,cAAYiB,EAAE,kBAAkB,SAAS;IACzC,MAAK;IACL,WAAU;IACV,eAAe;KAEb,AADAF,EAAU,EAAI,GACdI,IAAY;IACd;GACD,CAAA,CAEA;;CACF,CAAA;AAET,CAAC;AACD,QAAA,IAAA,aAA6B,iBAAc,EAAO,cAAc"}
1
+ {"version":3,"file":"banner-BinTH032.js","names":["__icon_InformationCircleIcon","__icon_CheckmarkCircle02Icon","__icon_Alert02Icon","__icon_AlertCircleIcon","__icon_Cancel01Icon","cn","useUiText","Icon","IconButton","KAESO_BANNER_VARIANTS","KAESO_BANNER_DEFAULT_VARIANTS","ICON","InformationCircleIcon","CheckmarkCircle02Icon","Alert02Icon","AlertCircleIcon","ICON_TONE","Banner","hidden","setHidden","useState","t","dismissible","onDismiss","tone","devWarn","mark","icon","layout","className","actions","title","children","Cancel01Icon"],"sources":["../../src/components/banner/banner.tsx"],"sourcesContent":["import { forwardRef, useState, type ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn.js\";\nimport { InformationCircleIcon as __icon_InformationCircleIcon, CheckmarkCircle02Icon as __icon_CheckmarkCircle02Icon, Alert02Icon as __icon_Alert02Icon, AlertCircleIcon as __icon_AlertCircleIcon, Cancel01Icon as __icon_Cancel01Icon } from \"@hugeicons/core-free-icons\";\nimport { Icon, type IconData } from \"../icon/icon.js\";\nimport { IconButton } from \"../icon-button/icon-button.js\";\nimport { useUiText } from \"../../i18n/context.js\";\nimport { devWarn } from \"../../utils/dev.js\";\n\nexport const KAESO_BANNER_VARIANTS = {\n tone: {\n neutral: { classes: \"bg-fill-1 text-fg\" },\n info: { classes: \"bg-info-tint text-fg\" },\n success: { classes: \"bg-success-tint text-fg\" },\n warning: { classes: \"bg-warning-tint text-fg\" },\n danger: { classes: \"bg-danger-tint text-fg\" },\n },\n layout: {\n inline: {\n classes: \"flex min-h-56 flex-col justify-center rounded-well px-12 py-12\",\n },\n full: { classes: \"rounded-none px-24 py-10\" },\n },\n} as const;\nexport const KAESO_BANNER_DEFAULT_VARIANTS = { tone: \"neutral\", layout: \"inline\" } as const;\n\nconst ICON: Record<keyof typeof KAESO_BANNER_VARIANTS.tone, IconData | undefined> = {\n neutral: undefined,\n info: __icon_InformationCircleIcon,\n success: __icon_CheckmarkCircle02Icon,\n warning: __icon_Alert02Icon,\n danger: __icon_AlertCircleIcon,\n};\nconst ICON_TONE = {\n neutral: \"text-fg-secondary\",\n info: \"text-info-text\",\n success: \"text-success-text\",\n warning: \"text-warning-text\",\n danger: \"text-danger-text\",\n} as const;\n\nexport interface BannerProps {\n tone?: keyof typeof KAESO_BANNER_VARIANTS.tone | undefined;\n layout?: keyof typeof KAESO_BANNER_VARIANTS.layout | undefined;\n title?: ReactNode | undefined;\n children?: ReactNode | undefined;\n icon?: IconData | undefined;\n actions?: ReactNode | undefined;\n onDismiss?: (() => void) | undefined;\n className?: string | undefined;\n}\n\nexport const Banner = /* @__PURE__ */ forwardRef<HTMLDivElement, BannerProps>(function Banner(\n { tone = \"neutral\", layout = \"inline\", title, children, icon, actions, onDismiss, className },\n ref,\n) {\n const [hidden, setHidden] = useState(false);\n const t = useUiText();\n if (hidden) return null;\n const dismissible = onDismiss && (tone === \"neutral\" || tone === \"info\");\n if (onDismiss && !dismissible) devWarn(`Banner: a ${tone} banner can't be dismissed; it stays until its cause is fixed, so onDismiss is ignored.`);\n const mark = icon ?? ICON[tone];\n return (\n <div\n ref={ref}\n role={tone === \"danger\" ? \"alert\" : \"status\"}\n className={cn(\n \"@container w-full forced-colors:outline forced-colors:-outline-offset-1\",\n KAESO_BANNER_VARIANTS.tone[tone].classes,\n KAESO_BANNER_VARIANTS.layout[layout].classes,\n className,\n )}\n >\n <div className={cn(\"flex items-start gap-8\", actions && \"@banner:items-center\")}>\n <div className=\"flex min-w-0 flex-1 flex-col gap-12 @banner:flex-row @banner:items-center @banner:gap-24\">\n <div className=\"flex min-w-0 flex-1 items-start gap-8\">\n {mark && <Icon icon={mark} size=\"sm\" className={cn(\"mt-2\", ICON_TONE[tone])} />}\n <div className=\"flex min-w-0 flex-1 flex-col gap-2 text-body\">\n {title && <span className=\"font-semibold text-fg\">{title}</span>}\n {children && <div className=\"text-fg text-pretty\">{children}</div>}\n </div>\n </div>\n {actions && <div className={cn(\"flex shrink-0 flex-wrap items-center gap-8 @banner:ml-0\", mark && \"ml-24\")}>{actions}</div>}\n </div>\n {dismissible && (\n <IconButton\n icon={__icon_Cancel01Icon}\n aria-label={t(\"banner.dismiss\", \"Dismiss\")}\n size=\"xs\"\n className=\"-my-2 -mr-6 hover:bg-fill-2 active:bg-fill-3\"\n onClick={() => {\n setHidden(true);\n onDismiss?.();\n }}\n />\n )}\n </div>\n </div>\n );\n});\nif (process.env.NODE_ENV !== \"production\") Banner.displayName = \"Banner\";\n"],"mappings":";;;;;;;;;;AAQA,IAAaS,IAAwB;CACnC,MAAM;EACJ,SAAS,EAAE,SAAS,oBAAoB;EACxC,MAAM,EAAE,SAAS,uBAAuB;EACxC,SAAS,EAAE,SAAS,0BAA0B;EAC9C,SAAS,EAAE,SAAS,0BAA0B;EAC9C,QAAQ,EAAE,SAAS,yBAAyB;CAC9C;CACA,QAAQ;EACN,QAAQ,EACN,SAAS,iEACX;EACA,MAAM,EAAE,SAAS,2BAA2B;CAC9C;AACF,GACaC,IAAgC;CAAE,MAAM;CAAW,QAAQ;AAAS,GAE3EC,IAA8E;CAClF,SAAS,KAAA;CACT,MAAMX;CACN,SAASC;CACT,SAASC;CACT,QAAQC;AACV,GACMa,IAAY;CAChB,SAAS;CACT,MAAM;CACN,SAAS;CACT,SAAS;CACT,QAAQ;AACV,GAaaC,IAAyB,kBAAwC,SAC5E,EAAE,UAAO,WAAW,YAAS,UAAU,UAAO,aAAU,SAAM,YAAS,cAAW,gBAClF,GACA;CACA,IAAM,CAACC,GAAQC,KAAaC,EAAS,EAAK,GACpCC,IAAIf,EAAU;CACpB,IAAIY,GAAQ,OAAO;CACnB,IAAMI,IAAcC,MAAcC,MAAS,aAAaA,MAAS;CACjE,AAAID,KAAa,CAACD,KAAaG,EAAQ,aAAaD,EAAK,wFAAwF;CACjJ,IAAME,IAAOC,KAAQhB,EAAKa;CAC1B,OACE,kBAAC,OAAD;EACO;EACL,MAAMA,MAAS,WAAW,UAAU;EACpC,WAAWnB,EACT,2EACAI,EAAsB,KAAKe,EAAK,CAAC,SACjCf,EAAsB,OAAOmB,EAAO,CAAC,SACrCC,CACF;EAEA,UAAA,kBAAC,OAAD;GAAK,WAAWxB,EAAG,0BAA0ByB,KAAW,sBAAsB;GAA9E,UAAA,CACE,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACGJ,KAAQ,kBAACnB,GAAD;MAAM,MAAMmB;MAAM,MAAK;MAAK,WAAWrB,EAAG,QAAQW,EAAUQ,EAAK;KAAI,CAAA,GAC9E,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACGO,KAAS,kBAAC,QAAD;OAAM,WAAU;OAAyB,UAAAA;MAAY,CAAA,GAC9DC,KAAY,kBAAC,OAAD;OAAK,WAAU;OAAuB;MAAc,CAAA,CAC9D;KACF,CAAA,CAAA;IACJ,CAAA,GAAAF,KAAW,kBAAC,OAAD;KAAK,WAAWzB,EAAG,2DAA2DqB,KAAQ,OAAO;KAAI,UAAAI;IAAa,CAAA,CACvH;GACJ,CAAA,GAAAR,KACC,kBAACd,GAAD;IACE,MAAMJ;IACN,cAAYiB,EAAE,kBAAkB,SAAS;IACzC,MAAK;IACL,WAAU;IACV,eAAe;KAEb,AADAF,EAAU,EAAI,GACdI,IAAY;IACd;GACD,CAAA,CAEA;;CACF,CAAA;AAET,CAAC;AACD,QAAA,IAAA,aAA6B,iBAAc,EAAO,cAAc"}
@@ -83,7 +83,7 @@ function x(e) {
83
83
  return t.some((e) => e.toLowerCase() === "mod") ? `${n("Meta")} ${n("Control")}` : n("");
84
84
  }
85
85
  function S({ variant: t = h.variant, size: n = h.size, shape: r = h.shape, leading: i = !1, trailing: a = !1, fullWidth: o = !1 } = {}) {
86
- return e("relative inline-flex max-w-full shrink-0 select-none items-center justify-center whitespace-nowrap no-underline", "cursor-pointer transition-control focus-ring tap-target disabled:cursor-not-allowed", m.size[n].classes, m.shape[r].classes, r === "circle" && v[n], r === "pill" && i && t !== "link" && g[n], r === "pill" && a && t !== "link" && _[n], t === "link" && "-mx-2 h-auto rounded-code px-2 align-baseline outline-offset-0", m.variant[t].classes, o && "w-full");
86
+ return e("relative inline-flex max-w-full shrink-0 select-none ghost-start:max-w-none ghost-end:max-w-none items-center justify-center whitespace-nowrap no-underline", "cursor-pointer transition-control focus-ring tap-target disabled:cursor-not-allowed", m.size[n].classes, m.shape[r].classes, r === "circle" && v[n], r === "pill" && i && t !== "link" && g[n], r === "pill" && a && t !== "link" && _[n], t === "link" && "-mx-2 h-auto rounded-code px-2 align-baseline outline-offset-0", m.variant[t].classes, o && "w-full");
87
87
  }
88
88
  var C = /* @__PURE__ */ l(function(l, m) {
89
89
  let { variant: g = h.variant, size: _ = h.size, loading: v = !1, disabled: b = !1, disabledReason: C, href: w, target: T, rel: E, fullWidth: ie, className: D, type: ae, onClick: oe, onFocus: O, onBlur: k, ...A } = l, j = i(), [se, M] = d(!1), N = u(null);
@@ -199,4 +199,4 @@ process.env.NODE_ENV !== "production" && (C.displayName = "Button");
199
199
  //#endregion
200
200
  export { S as a, m as i, C as n, h as r, y as t };
201
201
 
202
- //# sourceMappingURL=button-IblhXUyZ.js.map
202
+ //# sourceMappingURL=button-DrmFgdIi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"button-DrmFgdIi.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 ghost-start:max-w-none ghost-end:max-w-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,5 +1,5 @@
1
1
  "use client";
2
- import { l as e } from "./styles-hkFkoBbi.js";
2
+ import { l as e } from "./styles-8fn_bHRP.js";
3
3
  import { t } from "./cn-BjnOAUrA.js";
4
4
  import { a as n } from "./field-D7m-yl-D.js";
5
5
  import { t as r } from "./labelled-D5udSPUI.js";
@@ -138,4 +138,4 @@ var x = /* @__PURE__ */ Object.assign(_, {
138
138
  //#endregion
139
139
  export { y as a, f as c, m as i, g as n, v as o, S as r, p as s, x as t };
140
140
 
141
- //# sourceMappingURL=checkbox-9tbimmF3.js.map
141
+ //# sourceMappingURL=checkbox-ahl1SOqU.js.map