@jini-ai/ui 0.6.15-rc.1 → 0.6.15

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 (195) hide show
  1. package/dist/browser/useDismissOnOutsideOrEscape.js +1 -1
  2. package/dist/browser/useGlobalKeydown.js +2 -2
  3. package/dist/browser/useModalWindowDragGuard.js +1 -1
  4. package/dist/core/theme/css-name.d.ts +3 -0
  5. package/dist/core/theme/css-name.js +5 -0
  6. package/dist/core/theme/stylesheet.js +2 -1
  7. package/dist/core/theme/validation.js +15 -4
  8. package/dist/features/about/rules.js +2 -1
  9. package/dist/features/admin-widgets/components/InfoTip.hooks.js +22 -12
  10. package/dist/features/admin-widgets/components/Lightbox/Lightbox.hooks.js +1 -1
  11. package/dist/features/admin-widgets/components/ScrollJump/ScrollJump.hooks.js +1 -1
  12. package/dist/features/admin-widgets/components/SeeMore/SeeMore.hooks.js +2 -2
  13. package/dist/features/admin-widgets/components/SeeMore/SeeMore.js +4 -2
  14. package/dist/features/admin-widgets/components/Select/Select.hooks.js +2 -1
  15. package/dist/features/admin-widgets/components/Select/Select.js +2 -1
  16. package/dist/features/admin-widgets/components/SuggestInput/SuggestInput.js +4 -2
  17. package/dist/features/admin-widgets/components/useDebouncedHtmlPreview.hooks.js +3 -2
  18. package/dist/features/asset-grid/react/components/AssetGrid.js +8 -3
  19. package/dist/features/asset-grid/react/hooks/useAssetGridKeyboardShortcuts.js +7 -6
  20. package/dist/features/asset-grid/react/hooks/useAssetGridLiveUpdates.js +8 -10
  21. package/dist/features/asset-grid/react/hooks/useRubberBandDrag.js +1 -1
  22. package/dist/features/asset-tree-browser/react/components/AssetTreeFileRow.js +6 -8
  23. package/dist/features/asset-tree-browser/react/hooks/useAssetTreeRowMenu.js +1 -1
  24. package/dist/features/asset-tree-browser/rules.js +1 -3
  25. package/dist/features/browser-chrome/rules.js +10 -8
  26. package/dist/features/charts/browser.js +2 -1
  27. package/dist/features/charts/react.js +3 -1
  28. package/dist/features/connectors/ConnectorsBrowser.js +3 -1
  29. package/dist/features/connectors/hooks/useConnectorAuthorization.js +1 -1
  30. package/dist/features/connectors/hooks/useConnectorCatalog.js +2 -2
  31. package/dist/features/connectors/rules.js +10 -14
  32. package/dist/features/execution/react/components/AgentDiagnosticRow.js +2 -0
  33. package/dist/features/execution/react/components/ByokProviderForm.js +1 -3
  34. package/dist/features/execution/react/components/LocalCliAgentSettings.js +2 -1
  35. package/dist/features/execution/react/hooks/use-byok-field-validation.hooks.js +6 -2
  36. package/dist/features/execution/react/hooks/useExecutionTab.js +9 -5
  37. package/dist/features/execution/react/hooks/useLocalCliAgentCard.js +3 -6
  38. package/dist/features/execution/react/hooks/useReasoningControl.js +3 -3
  39. package/dist/features/execution/rules.js +23 -18
  40. package/dist/features/external-mcp/react/components/ExternalMcpTab.js +10 -1
  41. package/dist/features/file-dropzone/rules.js +3 -2
  42. package/dist/features/html-editor/canvas-embed-placeholders.js +2 -3
  43. package/dist/features/html-editor/css.js +7 -5
  44. package/dist/features/html-editor/editor-blocks.js +60 -6
  45. package/dist/features/html-editor/protected-elements.js +5 -3
  46. package/dist/features/html-editor/react/hooks/useInteractiveHtmlEditor.js +3 -3
  47. package/dist/features/html-editor/source-splice.js +6 -4
  48. package/dist/features/iframe-pool/react/components/IframeKeepAliveProvider.js +5 -5
  49. package/dist/features/iframe-pool/react/dom-sync.js +2 -2
  50. package/dist/features/integrations/react/components/IntegrationsTab.js +3 -1
  51. package/dist/features/integrations/rules.js +6 -4
  52. package/dist/features/interactive-ui/interactive-ui.css +1 -1
  53. package/dist/features/interactive-ui/providers/shadcn/button.d.ts +8 -6
  54. package/dist/features/interactive-ui/providers/shadcn/button.js +5 -6
  55. package/dist/features/interactive-ui/providers/shadcn/card.d.ts +3 -3
  56. package/dist/features/interactive-ui/providers/shadcn/card.js +3 -4
  57. package/dist/features/interactive-ui/providers/shadcn/data-table.js +10 -5
  58. package/dist/features/interactive-ui/providers/shadcn/select.d.ts +3 -5
  59. package/dist/features/interactive-ui/providers/shadcn/select.js +3 -7
  60. package/dist/features/interactive-ui/providers/shadcn/table.d.ts +4 -5
  61. package/dist/features/interactive-ui/providers/shadcn/table.js +4 -9
  62. package/dist/features/interactive-ui/table-data.js +1 -1
  63. package/dist/features/lexical-rich-text-editor/deserialize.js +2 -2
  64. package/dist/features/lexical-rich-text-editor/mention-parser.js +4 -4
  65. package/dist/features/lexical-rich-text-editor/react/components/RichTextInput.js +2 -1
  66. package/dist/features/lexical-rich-text-editor/react/hooks/useCaretFloatingLayerPosition.js +1 -1
  67. package/dist/features/lexical-rich-text-editor/react/hooks/useMentionColorStamping.js +1 -1
  68. package/dist/features/lexical-rich-text-editor/serialize.js +13 -10
  69. package/dist/features/list-detail-panel/react/components/ListDetailPanel.js +1 -1
  70. package/dist/features/mcp-ui/confirmation-store.js +3 -6
  71. package/dist/features/mcp-ui/surfaces/confirmation.d.ts +5 -0
  72. package/dist/features/mcp-ui/surfaces/confirmation.js +1 -0
  73. package/dist/features/mcp-ui/surfaces/document.d.ts +3 -15
  74. package/dist/features/mcp-ui/surfaces/document.js +37 -6
  75. package/dist/features/mcp-ui/surfaces/fields.js +2 -0
  76. package/dist/features/mcp-ui/surfaces/host-theme.js +2 -1
  77. package/dist/features/mcp-ui/surfaces/index.d.ts +1 -0
  78. package/dist/features/mcp-ui/surfaces/index.js +1 -0
  79. package/dist/features/mcp-ui/surfaces/outcome.js +1 -1
  80. package/dist/features/mcp-ui/surfaces/select.js +2 -1
  81. package/dist/features/mcp-ui/surfaces/structured-details.d.ts +40 -0
  82. package/dist/features/mcp-ui/surfaces/structured-details.js +159 -0
  83. package/dist/features/mcp-ui/surfaces/text-input.js +1 -1
  84. package/dist/features/mcp-ui/surfaces/tool-approval.d.ts +21 -0
  85. package/dist/features/mcp-ui/surfaces/tool-approval.js +41 -0
  86. package/dist/features/media-providers/react/hooks/useMediaProvidersTab.js +2 -1
  87. package/dist/features/memory/async-commit-guard.js +4 -1
  88. package/dist/features/memory/formatters.js +5 -1
  89. package/dist/features/memory/react/components/MemoryConnectedPanel.js +3 -1
  90. package/dist/features/memory/react/components/MemoryEntryCard.js +1 -1
  91. package/dist/features/memory/react/components/MemorySettingsPanel.js +3 -1
  92. package/dist/features/memory/react/hooks/useMemoryConfig.hooks.js +12 -10
  93. package/dist/features/memory/react/hooks/useMemoryConnectors.hooks.js +2 -5
  94. package/dist/features/memory/react/hooks/useMemoryConnectors.rules.js +10 -9
  95. package/dist/features/memory/react/hooks/useMemoryEntries.hooks.js +4 -2
  96. package/dist/features/memory/react/hooks/useMemoryFlash.hooks.js +1 -1
  97. package/dist/features/memory/rules.js +2 -1
  98. package/dist/features/panel-kit/fetch-query/adapter.react.js +3 -2
  99. package/dist/features/panel-kit/fetch-query/adapter.tanstack.js +3 -2
  100. package/dist/features/panel-kit/fetch-query/binding.react.js +2 -1
  101. package/dist/features/panel-kit/helpers/standing-draft-recovery-message.js +13 -4
  102. package/dist/features/panel-kit/hooks/use-dirty-guard.hooks.js +1 -1
  103. package/dist/features/panel-kit/hooks/use-focus-trap.hooks.js +1 -1
  104. package/dist/features/panel-kit/hooks/use-settings-slice.hooks.js +14 -10
  105. package/dist/features/panel-kit/hooks/use-standing-draft-autosave.hooks.js +2 -2
  106. package/dist/features/progress-card/components/ProgressCard.d.ts +1 -1
  107. package/dist/features/progress-card/reference-adapters.js +23 -13
  108. package/dist/features/progress-card/rules.d.ts +0 -1
  109. package/dist/features/progress-card/rules.js +14 -20
  110. package/dist/features/progress-card/types.d.ts +1 -1
  111. package/dist/features/project-locations/dependencies.js +6 -1
  112. package/dist/features/project-locations/react/components/ProjectLocationsTab.js +2 -1
  113. package/dist/features/project-locations/rules.js +2 -1
  114. package/dist/features/resource-dashboard/react/components/ResourceBoardToolbar.js +8 -1
  115. package/dist/features/resource-dashboard/react/components/ResourceBoardView.js +3 -2
  116. package/dist/features/resource-dashboard/react/components/ResourceBoardViewParts.d.ts +0 -2
  117. package/dist/features/resource-dashboard/react/components/ResourceBoardViewParts.js +0 -6
  118. package/dist/features/resource-dashboard/react/components/ResourceCardParts.js +2 -1
  119. package/dist/features/resource-dashboard/react/components/ResourceRowListItem.js +3 -1
  120. package/dist/features/resource-dashboard/react/components/ResourceRowListItemParts.js +2 -1
  121. package/dist/features/resource-dashboard/react/components/ResourceRowListView.js +1 -1
  122. package/dist/features/resource-dashboard/react/hooks/useResourceBoard.js +1 -1
  123. package/dist/features/schedule-picker/rules.js +13 -7
  124. package/dist/features/sketch-editor/constants.d.ts +0 -6
  125. package/dist/features/sketch-editor/constants.js +17 -15
  126. package/dist/features/sketch-editor/dom.js +4 -7
  127. package/dist/features/sketch-editor/react/components/SketchMainMenu.js +2 -1
  128. package/dist/features/sketch-editor/react/components/SketchSaveStateBadge.js +2 -1
  129. package/dist/features/sketch-editor/react/hooks/useSketchDomEnhancements.js +1 -1
  130. package/dist/features/sketch-editor/rules.js +13 -12
  131. package/dist/features/skills/dependencies.js +9 -4
  132. package/dist/features/skills/react/components/SkillRow.js +2 -1
  133. package/dist/features/skills/react/components/SkillsTab.js +2 -1
  134. package/dist/features/skills/rules.js +3 -3
  135. package/dist/features/source-config-list/agent-handles.js +4 -3
  136. package/dist/features/source-config-list/react/components/SourceConfigItemCard.js +3 -1
  137. package/dist/features/tab-strip/react/components/TabBar.hooks.js +4 -2
  138. package/dist/features/version-manager/react/components/VersionPreviewFrame.js +4 -1
  139. package/dist/features/version-manager/react/components/VersionSidebar.js +8 -6
  140. package/dist/features/version-manager/react/hooks/usePreviewCanvasSize.js +1 -1
  141. package/dist/features/version-manager/react/hooks/useVersionManager.js +5 -7
  142. package/dist/features/version-manager/rules.js +3 -5
  143. package/dist/features/viewer-shell/react/components/CommentSidePanel.js +2 -1
  144. package/dist/features/viewer-shell/react/components/SegmentedToggle.js +2 -1
  145. package/dist/features/viewer-shell/react/components/ViewerShell.js +2 -1
  146. package/dist/features/viewer-shell/rules.js +8 -7
  147. package/dist/react/components/BrandLogo.js +10 -2
  148. package/dist/react/components/CustomSelect.js +1 -1
  149. package/dist/react/components/EditorIcon.js +17 -14
  150. package/dist/react/components/Loading.js +2 -1
  151. package/dist/react/components/OnboardingChipField.js +5 -1
  152. package/dist/react/components/OnboardingDropdown.js +6 -4
  153. package/dist/react/components/PaletteTweaks.js +7 -6
  154. package/dist/react/components/PillButton.js +2 -1
  155. package/dist/react/components/PopoverMenu.js +2 -1
  156. package/dist/react/components/RemixIcon.js +2 -1
  157. package/dist/react/components/SecretInput.hooks.d.ts +2 -25
  158. package/dist/react/components/SecretInput.hooks.js +2 -24
  159. package/dist/react/components/SecretInput.js +5 -4
  160. package/dist/react/components/Toast.js +4 -2
  161. package/dist/react/components/TooltipLayer.js +4 -1
  162. package/dist/react/components/WorkingDirPicker.js +5 -4
  163. package/dist/react/components/remixicon-font-recovery.js +9 -1
  164. package/dist/react/components/select-popover.js +2 -2
  165. package/dist/react/hooks/useBrandFonts.js +1 -1
  166. package/dist/react/hooks/useEdgeAutoScroll.js +1 -1
  167. package/dist/react/hooks/useInView.js +9 -9
  168. package/dist/react/hooks/useResizableSplitPane.js +12 -20
  169. package/dist/react/mcp-ui/useHostSurfaceTokens.js +1 -1
  170. package/dist/renderers/annotation-canvas/react/components/AnnotationCanvas.js +7 -1
  171. package/dist/renderers/annotation-canvas/react/hooks/useAnnotationCanvas.controller.js +4 -2
  172. package/dist/renderers/annotation-canvas/react/hooks/useAnnotationCanvas.js +9 -5
  173. package/dist/renderers/annotation-canvas/rules.js +9 -13
  174. package/dist/renderers/annotation-canvas/theme.js +5 -2
  175. package/dist/renderers/renderers/index.js +1 -1
  176. package/dist/renderers/renderers/markdown.js +4 -6
  177. package/dist/theme/apply.js +7 -3
  178. package/dist/utils/class-names.d.ts +3 -0
  179. package/dist/utils/class-names.js +5 -0
  180. package/dist/utils/design-md.js +3 -3
  181. package/dist/utils/ime-composing.d.ts +1 -1
  182. package/dist/utils/ime-composing.js +1 -2
  183. package/dist/utils/localized-url.js +2 -11
  184. package/dist/utils/markdown-scroll-sync.js +1 -1
  185. package/dist/utils/omit-keys.d.ts +3 -0
  186. package/dist/utils/omit-keys.js +8 -0
  187. package/dist/utils/polygon-selection.js +1 -1
  188. package/dist/utils/sse.js +3 -0
  189. package/dist/utils/trim-chars.d.ts +13 -0
  190. package/dist/utils/trim-chars.js +30 -0
  191. package/dist/utils/unhandled-case.d.ts +10 -0
  192. package/dist/utils/unhandled-case.js +12 -0
  193. package/dist/utils/unit-bezier.js +1 -3
  194. package/dist/utils/zip.js +6 -10
  195. package/package.json +10 -9
@@ -1,3 +1,4 @@
1
+ import { unhandledCase } from '../../utils/unhandled-case.js';
1
2
  /** Path hint per OS — a Windows user shouldn't see a `~/...` path their
2
3
  * shell won't expand, and vice versa. */
3
4
  export function homeConfigPath(platform, posix, windows) {
@@ -36,7 +37,8 @@ export function buildCodexEnvToml(serverName, info) {
36
37
  const entries = Object.entries(info.env ?? {});
37
38
  if (entries.length === 0)
38
39
  return '';
39
- return `\n\n[mcp_servers.${serverName}.env]\n${entries.map(([key, value]) => `${key} = ${JSON.stringify(value)}`).join('\n')}`;
40
+ const lines = entries.map(([key, value]) => `${key} = ${JSON.stringify(value)}`).join('\n');
41
+ return `\n\n[mcp_servers.${serverName}.env]\n${lines}`;
40
42
  }
41
43
  /** The `{"mcpServers": {"<serverName>": {...}}}` shape shared by Cursor,
42
44
  * Antigravity, and Windsurf. */
@@ -186,8 +188,8 @@ export function snippetForClient(clientId, serverName, info) {
186
188
  // refactored away rather than kept behind a coverage-suppression comment.
187
189
  // TypeScript still catches a missing case if `McpClientId` grows a member
188
190
  // and only `methodLabelForClient` gets updated: with every current case
189
- // returning, `tsc` requires this switch to be exhaustive too, or the
190
- // function's declared `McpClientSnippet` return type is violated on the
191
- // "falls through" path.
191
+ // returning, `unhandledCase`'s `never` parameter makes `tsc` require this
192
+ // switch to be exhaustive too.
193
+ return unhandledCase(clientId);
192
194
  }
193
195
  //# sourceMappingURL=rules.js.map
@@ -1,2 +1,2 @@
1
1
  /*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
2
- @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0}}}:root,[data-admin-theme],[data-color-scheme=light]{color-scheme:light;--jini-bg:var(--jini-theme-light-bg,#fff);--jini-surface:var(--jini-theme-light-surface,#f5f5f5);--jini-text:var(--jini-theme-light-text,#202020);--jini-muted:var(--jini-theme-light-muted,#666);--jini-border:var(--jini-theme-light-border,#d9d9d9);--jini-primary:var(--jini-theme-light-primary,#363636);--jini-primary-ink:var(--jini-theme-light-primary-ink,#fff);--jini-danger:var(--jini-theme-light-danger,#b42318);--jini-success:var(--jini-theme-light-success,#18763b);--jini-warning:var(--jini-theme-light-warning,#845800)}[data-color-scheme=dark]{color-scheme:dark;--jini-bg:var(--jini-theme-dark-bg,#171717);--jini-surface:var(--jini-theme-dark-surface,#242424);--jini-text:var(--jini-theme-dark-text,#f0f0f0);--jini-muted:var(--jini-theme-dark-muted,#b3b3b3);--jini-border:var(--jini-theme-dark-border,#454545);--jini-primary:var(--jini-theme-dark-primary,#e0e0e0);--jini-primary-ink:var(--jini-theme-dark-primary-ink,#202020);--jini-danger:var(--jini-theme-dark-danger,#ff8b80);--jini-success:var(--jini-theme-dark-success,#79d69b);--jini-warning:var(--jini-theme-dark-warning,#ebc36b)}:root,[data-color-scheme=light],[data-theme=light]{--jini-chart-default-1:oklch(55.29% .1129 43.4);--jini-chart-default-2:oklch(50% .11 240);--jini-chart-default-3:oklch(64% .13 88);--jini-chart-default-4:oklch(58% .15 350);--jini-chart-default-5:oklch(50% .11 155);--jini-chart-default-6:oklch(48% .12 295)}[data-color-scheme=dark],[data-theme=dark]{--jini-chart-default-1:oklch(62% .11 44);--jini-chart-default-2:oklch(64% .11 240);--jini-chart-default-3:oklch(66% .13 88);--jini-chart-default-4:oklch(65% .14 350);--jini-chart-default-5:oklch(56% .12 155);--jini-chart-default-6:oklch(64% .12 295)}:root{--jini-font-body:system-ui, sans-serif;--jini-font-heading:system-ui, sans-serif;--jini-font-mono:ui-monospace, monospace;--jini-radius:8px;--jini-density:1}:root,[data-admin-theme],[data-color-scheme]{--jini-bg-panel:var(--jini-surface);--jini-bg-subtle:var(--jini-surface)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-bg-subtle:color-mix(in srgb, var(--jini-surface) 75%, var(--jini-bg))}}:root,[data-admin-theme],[data-color-scheme]{--jini-bg-elevated:var(--jini-surface);--jini-border-soft:var(--jini-border);--jini-border-strong:var(--jini-border)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-border-strong:color-mix(in srgb, var(--jini-border) 75%, var(--jini-text))}}:root,[data-admin-theme],[data-color-scheme]{--jini-backdrop:var(--jini-text)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-backdrop:color-mix(in srgb, var(--jini-text) 42%, transparent)}}:root,[data-admin-theme],[data-color-scheme]{--jini-text-strong:var(--jini-text);--jini-text-secondary:var(--jini-text)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-text-secondary:color-mix(in srgb, var(--jini-text) 80%, var(--jini-bg))}}:root,[data-admin-theme],[data-color-scheme]{--jini-text-muted:var(--jini-muted);--jini-text-faint:var(--jini-muted)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-text-faint:color-mix(in srgb, var(--jini-muted) 75%, var(--jini-bg))}}:root,[data-admin-theme],[data-color-scheme]{--jini-text-disabled:var(--jini-muted)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-text-disabled:color-mix(in srgb, var(--jini-muted) 60%, var(--jini-bg))}}:root,[data-admin-theme],[data-color-scheme]{--jini-accent:var(--jini-primary);--jini-accent-hover:var(--jini-primary)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-accent-hover:color-mix(in srgb, var(--jini-primary) 88%, var(--jini-text))}}:root,[data-admin-theme],[data-color-scheme]{--jini-accent-strong:var(--jini-primary)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-accent-strong:color-mix(in srgb, var(--jini-primary) 85%, var(--jini-bg))}}:root,[data-admin-theme],[data-color-scheme]{--jini-accent-ink:var(--jini-primary-ink);--jini-accent-soft:var(--jini-primary)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-accent-soft:color-mix(in srgb, var(--jini-primary) 10%, transparent)}}:root,[data-admin-theme],[data-color-scheme]{--jini-accent-ring:var(--jini-primary)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-accent-ring:color-mix(in srgb, var(--jini-primary) 22%, transparent)}}:root,[data-admin-theme],[data-color-scheme]{--jini-neutral-accent:var(--jini-text);--jini-neutral-accent-hover:var(--jini-muted);--jini-neutral-accent-ink:var(--jini-bg);--jini-neutral-accent-text:var(--jini-text);--jini-neutral-accent-soft:var(--jini-text)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-neutral-accent-soft:color-mix(in srgb, var(--jini-text) 7%, transparent)}}:root,[data-admin-theme],[data-color-scheme]{--jini-neutral-accent-ring:var(--jini-text)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-neutral-accent-ring:color-mix(in srgb, var(--jini-text) 16%, transparent)}}:root,[data-admin-theme],[data-color-scheme]{--jini-link:var(--jini-primary);--jini-link-ink:var(--jini-primary-ink);--jini-success-bg:var(--jini-success)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-success-bg:color-mix(in srgb, var(--jini-success) 12%, var(--jini-bg))}}:root,[data-admin-theme],[data-color-scheme]{--jini-success-solid:var(--jini-success);--jini-success-solid-ink:var(--jini-bg);--jini-danger-bg:var(--jini-danger)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-danger-bg:color-mix(in srgb, var(--jini-danger) 12%, var(--jini-bg))}}:root,[data-admin-theme],[data-color-scheme]{--jini-warning-bg:var(--jini-warning)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-warning-bg:color-mix(in srgb, var(--jini-warning) 12%, var(--jini-bg))}}:root,[data-admin-theme],[data-color-scheme]{--jini-font-ui:var(--jini-font-body);--jini-font-display:var(--jini-font-heading);--jini-shadow-xs:0 1px 0 var(--jini-text)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-shadow-xs:0 1px 0 color-mix(in srgb, var(--jini-text) 4%, transparent)}}:root,[data-admin-theme],[data-color-scheme]{--jini-shadow-sm:0 1px 3px var(--jini-text)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-shadow-sm:0 1px 3px color-mix(in srgb, var(--jini-text) 10%, transparent)}}:root,[data-admin-theme],[data-color-scheme]{--jini-shadow-md:0 6px 24px var(--jini-text)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-shadow-md:0 6px 24px color-mix(in srgb, var(--jini-text) 15%, transparent)}}:root,[data-admin-theme],[data-color-scheme]{--jini-shadow-lg:0 24px 60px var(--jini-text)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-shadow-lg:0 24px 60px color-mix(in srgb, var(--jini-text) 22%, transparent)}}:root,[data-admin-theme],[data-color-scheme]{--jini-radius-xs:calc(var(--jini-radius) * .5);--jini-radius-sm:calc(var(--jini-radius) * .75);--jini-radius-md:calc(var(--jini-radius) * 1.25);--jini-radius-lg:calc(var(--jini-radius) * 1.5);--jini-radius-pill:999px;--jini-space-1:calc(.25rem * var(--jini-density));--jini-space-2:calc(.5rem * var(--jini-density));--jini-space-3:calc(.75rem * var(--jini-density));--jini-space-4:calc(1rem * var(--jini-density));--jini-space-5:calc(1.25rem * var(--jini-density));--jini-space-6:calc(1.5rem * var(--jini-density));--jini-space-7:calc(2rem * var(--jini-density));--jini-space-8:calc(2.5rem * var(--jini-density));--jini-font-size-2xs:.6875rem;--jini-font-size-xs:.75rem;--jini-font-size-sm:.8125rem;--jini-font-size-base:.875rem;--jini-font-size-md:.95rem;--jini-font-size-lg:1.05rem;--jini-font-size-xl:1.65rem;--jini-font-weight-normal:400;--jini-font-weight-medium:500;--jini-font-weight-semibold:600;--jini-font-weight-bold:700;--jini-line-tight:1.25;--jini-line-normal:1.5;--jini-line-relaxed:1.7;--jini-duration-fast:.12s;--jini-duration-base:.2s;--jini-duration-slow:.32s;--jini-ease-out:cubic-bezier(.23, 1, .32, 1);--jini-ease-in-out:cubic-bezier(.4, 0, .2, 1);--jini-transition-base:var(--jini-duration-base) var(--jini-ease-out);--jini-z-dropdown:100;--jini-z-sticky:200;--jini-z-overlay:300;--jini-z-modal:400;--jini-z-toast:500;--jini-modal-padding:24px;--jini-sidebar-width:240px;--jini-app-bg:var(--jini-theme-app-bg,var(--jini-default-app-bg));--jini-shell-bg:var(--jini-theme-shell-bg,var(--jini-bg));--jini-panel-bg:var(--jini-theme-panel-bg,var(--jini-default-panel-bg));--jini-panel-border:var(--jini-theme-panel-border,var(--jini-default-panel-border));--jini-panel-shadow:var(--jini-theme-panel-shadow,var(--jini-default-panel-shadow));--jini-panel-backdrop:var(--jini-theme-panel-backdrop);--jini-panel-texture:var(--jini-theme-panel-texture);--jini-rail-bg:var(--jini-theme-rail-bg,var(--jini-panel-bg));--jini-rail-border:var(--jini-theme-rail-border,var(--jini-panel-border));--jini-rail-shadow:var(--jini-theme-rail-shadow,none);--jini-rail-backdrop:var(--jini-theme-rail-backdrop,var(--jini-panel-backdrop,none));--jini-overlay-bg:var(--jini-theme-overlay-bg,var(--jini-default-overlay-bg));--jini-overlay-backdrop:var(--jini-theme-overlay-backdrop);--jini-overlay-shadow:var(--jini-theme-overlay-shadow,var(--jini-default-overlay-shadow));--jini-control-preview-backdrop:var(--jini-theme-control-preview-backdrop,blur(6px));--jini-control-bg:var(--jini-theme-control-bg,var(--jini-default-control-bg));--jini-control-border:var(--jini-theme-control-border,var(--jini-default-control-border));--jini-control-shadow:var(--jini-theme-control-shadow);--jini-control-shadow-hover:var(--jini-theme-control-shadow-hover);--jini-control-shadow-pressed:var(--jini-theme-control-shadow-pressed);--jini-control-shadow-inset:var(--jini-theme-control-shadow-inset);--jini-border-width:var(--jini-theme-border-width);--jini-control-chevron-image:var(--jini-theme-control-chevron-image,url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 14 14' fill='none'%3E%3Cpath d='M3.5 5.5 7 9l3.5-3.5' stroke='%23666C75' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"));--jini-overlay-tooltip-bg:var(--jini-theme-overlay-tooltip-bg,#fff);--jini-overlay-tooltip-text:var(--jini-theme-overlay-tooltip-text,#111);--jini-overlay-tooltip-border:var(--jini-theme-overlay-tooltip-border,#0000001a);--jini-overlay-bg-preview:var(--jini-theme-overlay-bg-preview,oklch(0% 0 0/.55));--jini-overlay-bg-navigation:var(--jini-theme-overlay-bg-navigation,oklch(0% 0 0/.4));--jini-code-string:var(--jini-theme-code-string,#4caf7a);--jini-code-number:var(--jini-theme-code-number,#d1975a);--jini-control-thumb-bg:var(--jini-theme-control-thumb-bg,#fff);--jini-control-solid-ink:var(--jini-theme-control-solid-ink,#fff);--jini-overlay-bg-lightbox:var(--jini-theme-overlay-bg-lightbox,oklch(0% 0 0/.6));--jini-lightbox-bg:var(--jini-theme-lightbox-bg,oklch(23% .005 256));--jini-lightbox-ink:var(--jini-theme-lightbox-ink,oklch(97% 0 0));--jini-lightbox-ink-muted:var(--jini-theme-lightbox-ink-muted,oklch(97% 0 0/.58));--jini-lightbox-media-bg:var(--jini-theme-lightbox-media-bg,oklch(0% 0 0/.25));--jini-lightbox-document-bg:var(--jini-theme-lightbox-document-bg,#fff);--jini-lightbox-button-border:var(--jini-theme-lightbox-button-border,oklch(100% 0 0/.16));--jini-lightbox-button-bg:var(--jini-theme-lightbox-button-bg,oklch(100% 0 0/.07));--jini-lightbox-button-bg-hover:var(--jini-theme-lightbox-button-bg-hover,oklch(100% 0 0/.15));--jini-lightbox-button-border-hover:var(--jini-theme-lightbox-button-border-hover,oklch(100% 0 0/.28));--jini-control-media-bg:var(--jini-theme-control-media-bg,oklch(0% 0 0/.55));--jini-control-media-ink:var(--jini-theme-control-media-ink,oklch(100% 0 0));--jini-control-media-border:var(--jini-theme-control-media-border,oklch(100% 0 0/.35));--jini-control-media-bg-hover:var(--jini-theme-control-media-bg-hover,oklch(0% 0 0/.72));--jini-overlay-bg-source:var(--jini-theme-overlay-bg-source,oklch(0% 0 0/.48));--jini-file-icon-folder:var(--jini-theme-file-icon-folder,oklch(72% .12 75));--jini-file-icon-json:var(--jini-theme-file-icon-json,oklch(72% .13 90));--jini-file-icon-markdown:var(--jini-theme-file-icon-markdown,oklch(62% .12 245));--jini-file-icon-javascript:var(--jini-theme-file-icon-javascript,oklch(76% .15 95));--jini-file-icon-typescript:var(--jini-theme-file-icon-typescript,oklch(60% .13 250));--jini-file-icon-config:var(--jini-theme-file-icon-config,oklch(62% .14 20));--jini-file-icon-html:var(--jini-theme-file-icon-html,oklch(64% .17 40));--jini-file-icon-css:var(--jini-theme-file-icon-css,oklch(62% .13 280));--jini-file-icon-image:var(--jini-theme-file-icon-image,oklch(64% .12 160));--jini-file-icon-shell:var(--jini-theme-file-icon-shell,oklch(64% .12 145));--jini-status-complete-ink-fallback:var(--jini-theme-status-complete-ink-fallback,oklch(99% 0 none));--jini-control-preview-ink:var(--jini-theme-control-preview-ink,#fff);--jini-control-preview-bg:var(--jini-theme-control-preview-bg,#1111116b);--jini-control-preview-bg-hover:var(--jini-theme-control-preview-bg-hover,#111111b8);--jini-control-preview-tip-bg:var(--jini-theme-control-preview-tip-bg,#111111e0);--jini-panel-border-muted:var(--jini-theme-panel-border-muted,#d9d9d9);--jini-control-composer-border-focus:var(--jini-theme-control-composer-border-focus,oklch(70% .012 255));--jini-overlay-bg-chat:var(--jini-theme-overlay-bg-chat,#00000073);--jini-control-hover-neutral-bg:var(--jini-theme-control-hover-neutral-bg,#7f7f7f26);--jini-control-recording-bg:var(--jini-theme-control-recording-bg,#dc2626);--jini-control-recording-ink:var(--jini-theme-control-recording-ink,#fff);--jini-control-recording-bg-hover:var(--jini-theme-control-recording-bg-hover,#b91c1c);--jini-control-shadow-focus:var(--jini-theme-control-shadow-focus,0 0 0 3px var(--jini-accent-ring));--jini-overlay-tooltip-shadow:var(--jini-theme-overlay-tooltip-shadow,0 4px 16px #00000040);--jini-control-shadow-focus-subtle:var(--jini-theme-control-shadow-focus-subtle,0 0 0 2px var(--jini-neutral-accent-soft));--jini-overlay-toast-shadow:var(--jini-theme-overlay-toast-shadow,0 8px 24px #00000038);--jini-status-danger-shadow:var(--jini-theme-status-danger-shadow,inset 3px 0 0 var(--jini-danger));--jini-control-thumb-shadow-strong:var(--jini-theme-control-thumb-shadow-strong,0 1px 2px #1c1b1a47);--jini-panel-shadow-divider:var(--jini-theme-panel-shadow-divider,inset 0 -1px 0 var(--jini-border));--jini-control-shadow-focus-accent:var(--jini-theme-control-shadow-focus-accent,0 0 0 3px var(--jini-accent))}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-control-shadow-focus-accent:var(--jini-theme-control-shadow-focus-accent,0 0 0 3px color-mix(in srgb, var(--jini-accent) 18%, transparent))}}:root,[data-admin-theme],[data-color-scheme]{--jini-overlay-menu-shadow-above:var(--jini-theme-overlay-menu-shadow-above,0 -4px 14px #141c2d17, 0 -1px 4px #141c2d0f);--jini-control-shadow-selected:var(--jini-theme-control-shadow-selected,0 0 0 1px var(--jini-accent));--jini-control-shadow-swatch-selected:var(--jini-theme-control-shadow-swatch-selected,0 0 0 2px var(--jini-bg-panel), 0 0 0 4px var(--jini-accent));--jini-control-shadow-segment:var(--jini-theme-control-shadow-segment,0 1px 2px #00000014);--jini-panel-shadow-sticky:var(--jini-theme-panel-shadow-sticky,0 6px 8px -6px #00000024);--jini-overlay-menu-shadow:var(--jini-theme-overlay-menu-shadow,0 12px 32px #0000001f);--jini-control-shadow-segment-raised:var(--jini-theme-control-shadow-segment-raised,0 1px 2px #0000001f);--jini-control-thumb-shadow:var(--jini-theme-control-thumb-shadow,0 1px 2px #00000040);--jini-panel-shadow-banner:var(--jini-theme-panel-shadow-banner,0 2px 8px #0000001f);--jini-status-warning-shadow:var(--jini-theme-status-warning-shadow,inset 2px 0 0 var(--jini-warning));--jini-panel-shadow-flat:var(--jini-theme-panel-shadow-flat,none)}:root{--jini-chat-font-body:var(--jini-theme-chat-font-body,-apple-system, BlinkMacSystemFont, "Segoe UI", "Microsoft YaHei UI", "Noto Sans", Roboto, "Helvetica Neue", Arial, sans-serif);--jini-chat-font-mono:var(--jini-theme-chat-font-mono,ui-monospace, SFMono-Regular, Menlo, monospace);--jini-chat-popover-shadow:var(--jini-theme-chat-popover-shadow,0 18px 46px #0d0c0a26, 0 2px 8px #0d0c0a0f);--jini-chat-bg:var(--jini-theme-chat-bg);--jini-chat-panel:var(--jini-theme-chat-panel);--jini-chat-text:var(--jini-theme-chat-text);--jini-chat-text-strong:var(--jini-theme-chat-text-strong);--jini-chat-muted:var(--jini-theme-chat-muted);--jini-chat-faint:var(--jini-theme-chat-faint);--jini-chat-border:var(--jini-theme-chat-border);--jini-chat-border-strong:var(--jini-theme-chat-border-strong);--jini-chat-border-soft:var(--jini-theme-chat-border-soft);--jini-chat-subtle:var(--jini-theme-chat-subtle);--jini-chat-accent:var(--jini-theme-chat-accent);--jini-chat-accent-soft:var(--jini-theme-chat-accent-soft);--jini-chat-danger:var(--jini-theme-chat-danger);--jini-chat-radius:var(--jini-theme-chat-radius);--jini-chat-radius-lg:var(--jini-theme-chat-radius-lg);--jini-chat-user-bubble:var(--jini-theme-chat-user-bubble);--jini-chat-user-bubble-ink:var(--jini-theme-chat-user-bubble-ink)}@layer theme{:root,:host{--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--font-weight-medium:500;--font-weight-semibold:600;--tracking-tight:-.025em;--radius-sm:.25rem;--radius-md:.375rem;--radius-xl:.75rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1)}}@layer base,components;@layer utilities{.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.right-2{right:calc(var(--spacing) * 2)}.z-50{z-index:50}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.my-1{margin-block:var(--spacing)}.mt-4{margin-top:calc(var(--spacing) * 4)}.block{display:block}.flex{display:flex}.grid{display:grid}.inline-flex{display:inline-flex}.table{display:table}.table-caption{display:table-caption}.table-cell{display:table-cell}.table-row{display:table-row}.aspect-square{aspect-ratio:1}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-px{height:1px}.max-h-\[--radix-select-content-available-height\]{max-height:--radix-select-content-available-height}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-9{width:calc(var(--spacing) * 9)}.w-full{width:100%}.min-w-\[8rem\]{min-width:8rem}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.shrink-0{flex-shrink:0}.caption-bottom{caption-side:bottom}.origin-\[--radix-select-content-transform-origin\]{transform-origin:--radix-select-content-transform-origin}.cursor-default{cursor:default}.flex-col{flex-direction:column}.place-content-center{place-content:center}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-2{gap:calc(var(--spacing) * 2)}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded-full{border-radius:3.40282e38px}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-input{border-color:var(--jini-border)}.border-primary{border-color:var(--jini-primary)}.bg-background{background-color:var(--jini-bg)}.bg-destructive{background-color:var(--jini-danger)}.bg-muted,.bg-muted\/50{background-color:var(--jini-surface)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/50{background-color:color-mix(in oklab, var(--jini-surface) 50%, transparent)}}.bg-primary{background-color:var(--jini-primary)}.bg-secondary{background-color:var(--jini-surface)}.bg-transparent{background-color:#0000}.fill-primary{fill:var(--jini-primary)}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-6{padding:calc(var(--spacing) * 6)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.pt-0{padding-top:0}.pr-8{padding-right:calc(var(--spacing) * 8)}.pl-2{padding-left:calc(var(--spacing) * 2)}.text-left{text-align:left}.align-middle{vertical-align:middle}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-none{--tw-leading:1;line-height:1}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.whitespace-nowrap{white-space:nowrap}.text-current{color:currentColor}.text-destructive-foreground{color:var(--jini-bg)}.text-foreground{color:var(--jini-text)}.text-input{color:var(--jini-border)}.text-muted-foreground{color:var(--jini-muted)}.text-primary{color:var(--jini-primary)}.text-primary-foreground{color:var(--jini-primary-ink)}.text-secondary-foreground{color:var(--jini-text)}.underline-offset-4{text-underline-offset:4px}.opacity-50{opacity:.5}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-offset-background{--tw-ring-offset-color:var(--jini-bg)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-70:is(:where(.peer):disabled~*){opacity:.7}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:var(--jini-text)}.placeholder\:text-muted-foreground::placeholder{color:var(--jini-muted)}@media (hover:hover){.hover\:bg-accent:hover{background-color:var(--jini-surface)}.hover\:bg-destructive\/90:hover{background-color:var(--jini-danger)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab, var(--jini-danger) 90%, transparent)}}.hover\:bg-muted\/50:hover{background-color:var(--jini-surface)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-muted\/50:hover{background-color:color-mix(in oklab, var(--jini-surface) 50%, transparent)}}.hover\:bg-primary\/90:hover{background-color:var(--jini-primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab, var(--jini-primary) 90%, transparent)}}.hover\:bg-secondary\/80:hover{background-color:var(--jini-surface)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab, var(--jini-surface) 80%, transparent)}}.hover\:text-accent-foreground:hover{color:var(--jini-text)}.hover\:underline:hover{text-decoration-line:underline}}.focus\:bg-accent:focus{background-color:var(--jini-surface)}.focus\:text-accent-foreground:focus{color:var(--jini-text)}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-ring:focus{--tw-ring-color:var(--jini-primary)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:var(--jini-primary)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.has-aria-expanded\:bg-muted\/50:has([aria-expanded=true]){background-color:var(--jini-surface)}@supports (color:color-mix(in lab, red, red)){.has-aria-expanded\:bg-muted\/50:has([aria-expanded=true]){background-color:color-mix(in oklab, var(--jini-surface) 50%, transparent)}}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[placeholder\]\:text-muted-foreground[data-placeholder]{color:var(--jini-muted)}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:var(--jini-primary)}.data-\[state\=checked\]\:text-primary-foreground[data-state=checked]{color:var(--jini-primary-ink)}.data-\[state\=selected\]\:bg-muted[data-state=selected]{background-color:var(--jini-surface)}@media (min-width:48rem){.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_tr\]\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}.\[\&\>span\]\:line-clamp-1>span{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.\[\&\>tr\]\:last\:border-b-0>tr:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}}.jini-data-table-frame{border:1px solid var(--jini-border);border-radius:var(--jini-radius);background:var(--jini-bg);min-width:0;max-width:100%;color:var(--jini-text);overflow:hidden}.jini-data-table-scroll,.jini-data-table-frame>[data-slot=table-container]{overscroll-behavior-x:contain;width:100%;max-height:28rem;overflow:auto}.jini-data-table{border-collapse:separate;border-spacing:0;width:100%;font-family:var(--jini-font-body);font-size:var(--jini-font-size-sm);line-height:var(--jini-line-normal);font-variant-numeric:tabular-nums}.jini-data-table th,.jini-data-table td{text-align:left;vertical-align:middle;white-space:nowrap;border-bottom:1px solid var(--jini-border);height:2.5rem;padding:.625rem .875rem}.jini-data-table th{z-index:1;background:var(--jini-surface);color:var(--jini-muted);font-size:var(--jini-font-size-xs);font-weight:var(--jini-font-weight-semibold);position:sticky;top:0}.jini-data-table tbody tr:last-child td{border-bottom:0}.jini-data-table tbody tr:nth-child(2n){background:var(--jini-bg-subtle)}.jini-data-table tbody tr:hover,.jini-data-table tbody tr:focus-visible{background:var(--jini-surface)}.jini-data-table tbody tr[role=button]{cursor:pointer}.jini-data-table [data-numeric=true]{text-align:right}.jini-data-table-sort{width:100%;min-height:1.5rem;color:inherit;font:inherit;text-align:inherit;cursor:pointer;background:0 0;border:0;justify-content:space-between;align-items:center;gap:.625rem;padding:0;display:inline-flex}.jini-data-table [data-numeric=true] .jini-data-table-sort{justify-content:flex-end}.jini-data-table th[aria-sort=ascending],.jini-data-table th[aria-sort=descending],.jini-data-table-sort:hover{color:var(--jini-text)}.jini-data-table td.jini-data-table-empty{height:8rem;color:var(--jini-muted);text-align:center}.jini-data-table-pagination{border-top:1px solid var(--jini-border);color:var(--jini-muted);font-size:var(--jini-font-size-xs);font-variant-numeric:tabular-nums;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:.75rem;padding:.625rem .875rem;display:flex}.jini-data-table-pagination-controls{gap:.5rem;display:flex}.jini-data-table-pagination button{border:1px solid var(--jini-border);border-radius:var(--jini-radius-sm);background:var(--jini-bg);min-height:2rem;color:var(--jini-text);font:inherit;cursor:pointer;padding:.375rem .75rem}.jini-data-table-pagination button:hover:not(:disabled){background:var(--jini-surface)}.jini-data-table-pagination button:disabled{opacity:.5;cursor:default}.jini-data-table-sort:focus-visible,.jini-data-table-pagination button:focus-visible,.jini-data-table tr[role=button]:focus-visible{outline:2px solid var(--jini-primary);outline-offset:-2px}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}
2
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0}}}:root,[data-admin-theme],[data-color-scheme=light]{color-scheme:light;--jini-bg:var(--jini-theme-light-bg,#fff);--jini-surface:var(--jini-theme-light-surface,#f5f5f5);--jini-text:var(--jini-theme-light-text,#202020);--jini-muted:var(--jini-theme-light-muted,#666);--jini-border:var(--jini-theme-light-border,#d9d9d9);--jini-primary:var(--jini-theme-light-primary,#363636);--jini-primary-ink:var(--jini-theme-light-primary-ink,#fff);--jini-danger:var(--jini-theme-light-danger,#b42318);--jini-success:var(--jini-theme-light-success,#18763b);--jini-warning:var(--jini-theme-light-warning,#845800)}[data-color-scheme=dark]{color-scheme:dark;--jini-bg:var(--jini-theme-dark-bg,#171717);--jini-surface:var(--jini-theme-dark-surface,#242424);--jini-text:var(--jini-theme-dark-text,#f0f0f0);--jini-muted:var(--jini-theme-dark-muted,#b3b3b3);--jini-border:var(--jini-theme-dark-border,#454545);--jini-primary:var(--jini-theme-dark-primary,#e0e0e0);--jini-primary-ink:var(--jini-theme-dark-primary-ink,#202020);--jini-danger:var(--jini-theme-dark-danger,#ff8b80);--jini-success:var(--jini-theme-dark-success,#79d69b);--jini-warning:var(--jini-theme-dark-warning,#ebc36b)}:root,[data-color-scheme=light],[data-theme=light]{--jini-chart-default-1:oklch(55.29% .1129 43.4);--jini-chart-default-2:oklch(50% .11 240);--jini-chart-default-3:oklch(64% .13 88);--jini-chart-default-4:oklch(58% .15 350);--jini-chart-default-5:oklch(50% .11 155);--jini-chart-default-6:oklch(48% .12 295)}[data-color-scheme=dark],[data-theme=dark]{--jini-chart-default-1:oklch(62% .11 44);--jini-chart-default-2:oklch(64% .11 240);--jini-chart-default-3:oklch(66% .13 88);--jini-chart-default-4:oklch(65% .14 350);--jini-chart-default-5:oklch(56% .12 155);--jini-chart-default-6:oklch(64% .12 295)}:root{--jini-font-body:system-ui, sans-serif;--jini-font-heading:system-ui, sans-serif;--jini-font-mono:ui-monospace, monospace;--jini-radius:8px;--jini-density:1}:root,[data-admin-theme],[data-color-scheme]{--jini-bg-panel:var(--jini-surface);--jini-bg-subtle:var(--jini-surface)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-bg-subtle:color-mix(in srgb, var(--jini-surface) 75%, var(--jini-bg))}}:root,[data-admin-theme],[data-color-scheme]{--jini-bg-elevated:var(--jini-surface);--jini-border-soft:var(--jini-border);--jini-border-strong:var(--jini-border)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-border-strong:color-mix(in srgb, var(--jini-border) 75%, var(--jini-text))}}:root,[data-admin-theme],[data-color-scheme]{--jini-backdrop:var(--jini-text)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-backdrop:color-mix(in srgb, var(--jini-text) 42%, transparent)}}:root,[data-admin-theme],[data-color-scheme]{--jini-text-strong:var(--jini-text);--jini-text-secondary:var(--jini-text)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-text-secondary:color-mix(in srgb, var(--jini-text) 80%, var(--jini-bg))}}:root,[data-admin-theme],[data-color-scheme]{--jini-text-muted:var(--jini-muted);--jini-text-faint:var(--jini-muted)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-text-faint:color-mix(in srgb, var(--jini-muted) 75%, var(--jini-bg))}}:root,[data-admin-theme],[data-color-scheme]{--jini-text-disabled:var(--jini-muted)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-text-disabled:color-mix(in srgb, var(--jini-muted) 60%, var(--jini-bg))}}:root,[data-admin-theme],[data-color-scheme]{--jini-accent:var(--jini-primary);--jini-accent-hover:var(--jini-primary)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-accent-hover:color-mix(in srgb, var(--jini-primary) 88%, var(--jini-text))}}:root,[data-admin-theme],[data-color-scheme]{--jini-accent-strong:var(--jini-primary)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-accent-strong:color-mix(in srgb, var(--jini-primary) 85%, var(--jini-bg))}}:root,[data-admin-theme],[data-color-scheme]{--jini-accent-ink:var(--jini-primary-ink);--jini-accent-soft:var(--jini-primary)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-accent-soft:color-mix(in srgb, var(--jini-primary) 10%, transparent)}}:root,[data-admin-theme],[data-color-scheme]{--jini-accent-ring:var(--jini-primary)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-accent-ring:color-mix(in srgb, var(--jini-primary) 22%, transparent)}}:root,[data-admin-theme],[data-color-scheme]{--jini-neutral-accent:var(--jini-text);--jini-neutral-accent-hover:var(--jini-muted);--jini-neutral-accent-ink:var(--jini-bg);--jini-neutral-accent-text:var(--jini-text);--jini-neutral-accent-soft:var(--jini-text)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-neutral-accent-soft:color-mix(in srgb, var(--jini-text) 7%, transparent)}}:root,[data-admin-theme],[data-color-scheme]{--jini-neutral-accent-ring:var(--jini-text)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-neutral-accent-ring:color-mix(in srgb, var(--jini-text) 16%, transparent)}}:root,[data-admin-theme],[data-color-scheme]{--jini-link:var(--jini-primary);--jini-link-ink:var(--jini-primary-ink);--jini-success-bg:var(--jini-success)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-success-bg:color-mix(in srgb, var(--jini-success) 12%, var(--jini-bg))}}:root,[data-admin-theme],[data-color-scheme]{--jini-success-solid:var(--jini-success);--jini-success-solid-ink:var(--jini-bg);--jini-danger-bg:var(--jini-danger)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-danger-bg:color-mix(in srgb, var(--jini-danger) 12%, var(--jini-bg))}}:root,[data-admin-theme],[data-color-scheme]{--jini-warning-bg:var(--jini-warning)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-warning-bg:color-mix(in srgb, var(--jini-warning) 12%, var(--jini-bg))}}:root,[data-admin-theme],[data-color-scheme]{--jini-font-ui:var(--jini-font-body);--jini-font-display:var(--jini-font-heading);--jini-shadow-xs:0 1px 0 var(--jini-text)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-shadow-xs:0 1px 0 color-mix(in srgb, var(--jini-text) 4%, transparent)}}:root,[data-admin-theme],[data-color-scheme]{--jini-shadow-sm:0 1px 3px var(--jini-text)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-shadow-sm:0 1px 3px color-mix(in srgb, var(--jini-text) 10%, transparent)}}:root,[data-admin-theme],[data-color-scheme]{--jini-shadow-md:0 6px 24px var(--jini-text)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-shadow-md:0 6px 24px color-mix(in srgb, var(--jini-text) 15%, transparent)}}:root,[data-admin-theme],[data-color-scheme]{--jini-shadow-lg:0 24px 60px var(--jini-text)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-shadow-lg:0 24px 60px color-mix(in srgb, var(--jini-text) 22%, transparent)}}:root,[data-admin-theme],[data-color-scheme]{--jini-radius-xs:calc(var(--jini-radius) * .5);--jini-radius-sm:calc(var(--jini-radius) * .75);--jini-radius-md:calc(var(--jini-radius) * 1.25);--jini-radius-lg:calc(var(--jini-radius) * 1.5);--jini-radius-pill:999px;--jini-space-1:calc(.25rem * var(--jini-density));--jini-space-2:calc(.5rem * var(--jini-density));--jini-space-3:calc(.75rem * var(--jini-density));--jini-space-4:calc(1rem * var(--jini-density));--jini-space-5:calc(1.25rem * var(--jini-density));--jini-space-6:calc(1.5rem * var(--jini-density));--jini-space-7:calc(2rem * var(--jini-density));--jini-space-8:calc(2.5rem * var(--jini-density));--jini-font-size-2xs:.6875rem;--jini-font-size-xs:.75rem;--jini-font-size-sm:.8125rem;--jini-font-size-base:.875rem;--jini-font-size-md:.95rem;--jini-font-size-lg:1.05rem;--jini-font-size-xl:1.65rem;--jini-font-weight-normal:400;--jini-font-weight-medium:500;--jini-font-weight-semibold:600;--jini-font-weight-bold:700;--jini-line-tight:1.25;--jini-line-normal:1.5;--jini-line-relaxed:1.7;--jini-duration-fast:.12s;--jini-duration-base:.2s;--jini-duration-slow:.32s;--jini-ease-out:cubic-bezier(.23, 1, .32, 1);--jini-ease-in-out:cubic-bezier(.4, 0, .2, 1);--jini-transition-base:var(--jini-duration-base) var(--jini-ease-out);--jini-z-dropdown:100;--jini-z-sticky:200;--jini-z-overlay:300;--jini-z-modal:400;--jini-z-toast:500;--jini-modal-padding:24px;--jini-sidebar-width:240px;--jini-app-bg:var(--jini-theme-app-bg,var(--jini-default-app-bg));--jini-shell-bg:var(--jini-theme-shell-bg,var(--jini-bg));--jini-panel-bg:var(--jini-theme-panel-bg,var(--jini-default-panel-bg));--jini-panel-border:var(--jini-theme-panel-border,var(--jini-default-panel-border));--jini-panel-shadow:var(--jini-theme-panel-shadow,var(--jini-default-panel-shadow));--jini-panel-backdrop:var(--jini-theme-panel-backdrop);--jini-panel-texture:var(--jini-theme-panel-texture);--jini-rail-bg:var(--jini-theme-rail-bg,var(--jini-panel-bg));--jini-rail-border:var(--jini-theme-rail-border,var(--jini-panel-border));--jini-rail-shadow:var(--jini-theme-rail-shadow,none);--jini-rail-backdrop:var(--jini-theme-rail-backdrop,var(--jini-panel-backdrop,none));--jini-overlay-bg:var(--jini-theme-overlay-bg,var(--jini-default-overlay-bg));--jini-overlay-backdrop:var(--jini-theme-overlay-backdrop);--jini-overlay-shadow:var(--jini-theme-overlay-shadow,var(--jini-default-overlay-shadow));--jini-control-preview-backdrop:var(--jini-theme-control-preview-backdrop,blur(6px));--jini-control-bg:var(--jini-theme-control-bg,var(--jini-default-control-bg));--jini-control-border:var(--jini-theme-control-border,var(--jini-default-control-border));--jini-control-shadow:var(--jini-theme-control-shadow);--jini-control-shadow-hover:var(--jini-theme-control-shadow-hover);--jini-control-shadow-pressed:var(--jini-theme-control-shadow-pressed);--jini-control-shadow-inset:var(--jini-theme-control-shadow-inset);--jini-border-width:var(--jini-theme-border-width);--jini-control-chevron-image:var(--jini-theme-control-chevron-image,url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 14 14' fill='none'%3E%3Cpath d='M3.5 5.5 7 9l3.5-3.5' stroke='%23666C75' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"));--jini-overlay-tooltip-bg:var(--jini-theme-overlay-tooltip-bg,#fff);--jini-overlay-tooltip-text:var(--jini-theme-overlay-tooltip-text,#111);--jini-overlay-tooltip-border:var(--jini-theme-overlay-tooltip-border,#0000001a);--jini-overlay-bg-preview:var(--jini-theme-overlay-bg-preview,oklch(0% 0 0/.55));--jini-overlay-bg-navigation:var(--jini-theme-overlay-bg-navigation,oklch(0% 0 0/.4));--jini-code-string:var(--jini-theme-code-string,#4caf7a);--jini-code-number:var(--jini-theme-code-number,#d1975a);--jini-control-thumb-bg:var(--jini-theme-control-thumb-bg,#fff);--jini-control-solid-ink:var(--jini-theme-control-solid-ink,#fff);--jini-overlay-bg-lightbox:var(--jini-theme-overlay-bg-lightbox,oklch(0% 0 0/.6));--jini-lightbox-bg:var(--jini-theme-lightbox-bg,oklch(23% .005 256));--jini-lightbox-ink:var(--jini-theme-lightbox-ink,oklch(97% 0 0));--jini-lightbox-ink-muted:var(--jini-theme-lightbox-ink-muted,oklch(97% 0 0/.58));--jini-lightbox-media-bg:var(--jini-theme-lightbox-media-bg,oklch(0% 0 0/.25));--jini-lightbox-document-bg:var(--jini-theme-lightbox-document-bg,#fff);--jini-lightbox-button-border:var(--jini-theme-lightbox-button-border,oklch(100% 0 0/.16));--jini-lightbox-button-bg:var(--jini-theme-lightbox-button-bg,oklch(100% 0 0/.07));--jini-lightbox-button-bg-hover:var(--jini-theme-lightbox-button-bg-hover,oklch(100% 0 0/.15));--jini-lightbox-button-border-hover:var(--jini-theme-lightbox-button-border-hover,oklch(100% 0 0/.28));--jini-control-media-bg:var(--jini-theme-control-media-bg,oklch(0% 0 0/.55));--jini-control-media-ink:var(--jini-theme-control-media-ink,oklch(100% 0 0));--jini-control-media-border:var(--jini-theme-control-media-border,oklch(100% 0 0/.35));--jini-control-media-bg-hover:var(--jini-theme-control-media-bg-hover,oklch(0% 0 0/.72));--jini-overlay-bg-source:var(--jini-theme-overlay-bg-source,oklch(0% 0 0/.48));--jini-file-icon-folder:var(--jini-theme-file-icon-folder,oklch(72% .12 75));--jini-file-icon-json:var(--jini-theme-file-icon-json,oklch(72% .13 90));--jini-file-icon-markdown:var(--jini-theme-file-icon-markdown,oklch(62% .12 245));--jini-file-icon-javascript:var(--jini-theme-file-icon-javascript,oklch(76% .15 95));--jini-file-icon-typescript:var(--jini-theme-file-icon-typescript,oklch(60% .13 250));--jini-file-icon-config:var(--jini-theme-file-icon-config,oklch(62% .14 20));--jini-file-icon-html:var(--jini-theme-file-icon-html,oklch(64% .17 40));--jini-file-icon-css:var(--jini-theme-file-icon-css,oklch(62% .13 280));--jini-file-icon-image:var(--jini-theme-file-icon-image,oklch(64% .12 160));--jini-file-icon-shell:var(--jini-theme-file-icon-shell,oklch(64% .12 145));--jini-status-complete-ink-fallback:var(--jini-theme-status-complete-ink-fallback,oklch(99% 0 none));--jini-control-preview-ink:var(--jini-theme-control-preview-ink,#fff);--jini-control-preview-bg:var(--jini-theme-control-preview-bg,#1111116b);--jini-control-preview-bg-hover:var(--jini-theme-control-preview-bg-hover,#111111b8);--jini-control-preview-tip-bg:var(--jini-theme-control-preview-tip-bg,#111111e0);--jini-panel-border-muted:var(--jini-theme-panel-border-muted,#d9d9d9);--jini-control-composer-border-focus:var(--jini-theme-control-composer-border-focus,oklch(70% .012 255));--jini-overlay-bg-chat:var(--jini-theme-overlay-bg-chat,#00000073);--jini-control-hover-neutral-bg:var(--jini-theme-control-hover-neutral-bg,#7f7f7f26);--jini-control-recording-bg:var(--jini-theme-control-recording-bg,#dc2626);--jini-control-recording-ink:var(--jini-theme-control-recording-ink,#fff);--jini-control-recording-bg-hover:var(--jini-theme-control-recording-bg-hover,#b91c1c);--jini-control-shadow-focus:var(--jini-theme-control-shadow-focus,0 0 0 3px var(--jini-accent-ring));--jini-overlay-tooltip-shadow:var(--jini-theme-overlay-tooltip-shadow,0 4px 16px #00000040);--jini-control-shadow-focus-subtle:var(--jini-theme-control-shadow-focus-subtle,0 0 0 2px var(--jini-neutral-accent-soft));--jini-overlay-toast-shadow:var(--jini-theme-overlay-toast-shadow,0 8px 24px #00000038);--jini-status-danger-shadow:var(--jini-theme-status-danger-shadow,inset 3px 0 0 var(--jini-danger));--jini-control-thumb-shadow-strong:var(--jini-theme-control-thumb-shadow-strong,0 1px 2px #1c1b1a47);--jini-panel-shadow-divider:var(--jini-theme-panel-shadow-divider,inset 0 -1px 0 var(--jini-border));--jini-control-shadow-focus-accent:var(--jini-theme-control-shadow-focus-accent,0 0 0 3px var(--jini-accent))}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-control-shadow-focus-accent:var(--jini-theme-control-shadow-focus-accent,0 0 0 3px color-mix(in srgb, var(--jini-accent) 18%, transparent))}}:root,[data-admin-theme],[data-color-scheme]{--jini-overlay-menu-shadow-above:var(--jini-theme-overlay-menu-shadow-above,0 -4px 14px #141c2d17, 0 -1px 4px #141c2d0f);--jini-control-shadow-selected:var(--jini-theme-control-shadow-selected,0 0 0 1px var(--jini-accent));--jini-control-shadow-swatch-selected:var(--jini-theme-control-shadow-swatch-selected,0 0 0 2px var(--jini-bg-panel), 0 0 0 4px var(--jini-accent));--jini-control-shadow-segment:var(--jini-theme-control-shadow-segment,0 1px 2px #00000014);--jini-panel-shadow-sticky:var(--jini-theme-panel-shadow-sticky,0 6px 8px -6px #00000024);--jini-overlay-menu-shadow:var(--jini-theme-overlay-menu-shadow,0 12px 32px #0000001f);--jini-control-shadow-segment-raised:var(--jini-theme-control-shadow-segment-raised,0 1px 2px #0000001f);--jini-control-thumb-shadow:var(--jini-theme-control-thumb-shadow,0 1px 2px #00000040);--jini-panel-shadow-banner:var(--jini-theme-panel-shadow-banner,0 2px 8px #0000001f);--jini-status-warning-shadow:var(--jini-theme-status-warning-shadow,inset 2px 0 0 var(--jini-warning));--jini-panel-shadow-flat:var(--jini-theme-panel-shadow-flat,none)}:root{--jini-chat-font-body:var(--jini-theme-chat-font-body,-apple-system, BlinkMacSystemFont, "Segoe UI", "Microsoft YaHei UI", "Noto Sans", Roboto, "Helvetica Neue", Arial, sans-serif);--jini-chat-font-mono:var(--jini-theme-chat-font-mono,ui-monospace, SFMono-Regular, Menlo, monospace);--jini-chat-popover-shadow:var(--jini-theme-chat-popover-shadow,0 18px 46px #0d0c0a26, 0 2px 8px #0d0c0a0f);--jini-chat-bg:var(--jini-theme-chat-bg);--jini-chat-panel:var(--jini-theme-chat-panel);--jini-chat-text:var(--jini-theme-chat-text);--jini-chat-text-strong:var(--jini-theme-chat-text-strong);--jini-chat-muted:var(--jini-theme-chat-muted);--jini-chat-faint:var(--jini-theme-chat-faint);--jini-chat-border:var(--jini-theme-chat-border);--jini-chat-border-strong:var(--jini-theme-chat-border-strong);--jini-chat-border-soft:var(--jini-theme-chat-border-soft);--jini-chat-subtle:var(--jini-theme-chat-subtle);--jini-chat-accent:var(--jini-theme-chat-accent);--jini-chat-accent-soft:var(--jini-theme-chat-accent-soft);--jini-chat-danger:var(--jini-theme-chat-danger);--jini-chat-radius:var(--jini-theme-chat-radius);--jini-chat-radius-lg:var(--jini-theme-chat-radius-lg);--jini-chat-user-bubble:var(--jini-theme-chat-user-bubble);--jini-chat-user-bubble-ink:var(--jini-theme-chat-user-bubble-ink)}@layer theme{:root,:host{--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--font-weight-medium:500;--font-weight-semibold:600;--tracking-tight:-.025em;--radius-sm:.25rem;--radius-md:.375rem;--radius-xl:.75rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1)}}@layer base,components;@layer utilities{.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.right-2{right:calc(var(--spacing) * 2)}.z-50{z-index:50}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.block{display:block}.flex{display:flex}.grid{display:grid}.inline-flex{display:inline-flex}.table{display:table}.table-cell{display:table-cell}.table-row{display:table-row}.aspect-square{aspect-ratio:1}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.max-h-\[--radix-select-content-available-height\]{max-height:--radix-select-content-available-height}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-9{width:calc(var(--spacing) * 9)}.w-full{width:100%}.min-w-\[8rem\]{min-width:8rem}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.shrink-0{flex-shrink:0}.caption-bottom{caption-side:bottom}.origin-\[--radix-select-content-transform-origin\]{transform-origin:--radix-select-content-transform-origin}.cursor-default{cursor:default}.flex-col{flex-direction:column}.place-content-center{place-content:center}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-2{gap:calc(var(--spacing) * 2)}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded-full{border-radius:3.40282e38px}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-input{border-color:var(--jini-border)}.border-primary{border-color:var(--jini-primary)}.bg-background{background-color:var(--jini-bg)}.bg-destructive{background-color:var(--jini-danger)}.bg-primary{background-color:var(--jini-primary)}.bg-secondary{background-color:var(--jini-surface)}.bg-transparent{background-color:#0000}.fill-primary{fill:var(--jini-primary)}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-6{padding:calc(var(--spacing) * 6)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.pt-0{padding-top:0}.pr-8{padding-right:calc(var(--spacing) * 8)}.pl-2{padding-left:calc(var(--spacing) * 2)}.text-left{text-align:left}.align-middle{vertical-align:middle}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-none{--tw-leading:1;line-height:1}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.whitespace-nowrap{white-space:nowrap}.text-current{color:currentColor}.text-destructive-foreground{color:var(--jini-bg)}.text-foreground{color:var(--jini-text)}.text-input{color:var(--jini-border)}.text-muted-foreground{color:var(--jini-muted)}.text-primary{color:var(--jini-primary)}.text-primary-foreground{color:var(--jini-primary-ink)}.text-secondary-foreground{color:var(--jini-text)}.underline-offset-4{text-underline-offset:4px}.opacity-50{opacity:.5}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-offset-background{--tw-ring-offset-color:var(--jini-bg)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-70:is(:where(.peer):disabled~*){opacity:.7}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:var(--jini-text)}.placeholder\:text-muted-foreground::placeholder{color:var(--jini-muted)}@media (hover:hover){.hover\:bg-accent:hover{background-color:var(--jini-surface)}.hover\:bg-destructive\/90:hover{background-color:var(--jini-danger)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab, var(--jini-danger) 90%, transparent)}}.hover\:bg-muted\/50:hover{background-color:var(--jini-surface)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-muted\/50:hover{background-color:color-mix(in oklab, var(--jini-surface) 50%, transparent)}}.hover\:bg-primary\/90:hover{background-color:var(--jini-primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab, var(--jini-primary) 90%, transparent)}}.hover\:bg-secondary\/80:hover{background-color:var(--jini-surface)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab, var(--jini-surface) 80%, transparent)}}.hover\:text-accent-foreground:hover{color:var(--jini-text)}.hover\:underline:hover{text-decoration-line:underline}}.focus\:bg-accent:focus{background-color:var(--jini-surface)}.focus\:text-accent-foreground:focus{color:var(--jini-text)}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-ring:focus{--tw-ring-color:var(--jini-primary)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:var(--jini-primary)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.has-aria-expanded\:bg-muted\/50:has([aria-expanded=true]){background-color:var(--jini-surface)}@supports (color:color-mix(in lab, red, red)){.has-aria-expanded\:bg-muted\/50:has([aria-expanded=true]){background-color:color-mix(in oklab, var(--jini-surface) 50%, transparent)}}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[placeholder\]\:text-muted-foreground[data-placeholder]{color:var(--jini-muted)}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:var(--jini-primary)}.data-\[state\=checked\]\:text-primary-foreground[data-state=checked]{color:var(--jini-primary-ink)}.data-\[state\=selected\]\:bg-muted[data-state=selected]{background-color:var(--jini-surface)}@media (min-width:48rem){.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_tr\]\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}.\[\&\>span\]\:line-clamp-1>span{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}}.jini-data-table-frame{border:1px solid var(--jini-border);border-radius:var(--jini-radius);background:var(--jini-bg);min-width:0;max-width:100%;color:var(--jini-text);overflow:hidden}.jini-data-table-scroll,.jini-data-table-frame>[data-slot=table-container]{overscroll-behavior-x:contain;width:100%;max-height:28rem;overflow:auto}.jini-data-table{border-collapse:separate;border-spacing:0;width:100%;font-family:var(--jini-font-body);font-size:var(--jini-font-size-sm);line-height:var(--jini-line-normal);font-variant-numeric:tabular-nums}.jini-data-table th,.jini-data-table td{text-align:left;vertical-align:middle;white-space:nowrap;border-bottom:1px solid var(--jini-border);height:2.5rem;padding:.625rem .875rem}.jini-data-table th{z-index:1;background:var(--jini-surface);color:var(--jini-muted);font-size:var(--jini-font-size-xs);font-weight:var(--jini-font-weight-semibold);position:sticky;top:0}.jini-data-table tbody tr:last-child td{border-bottom:0}.jini-data-table tbody tr:nth-child(2n){background:var(--jini-bg-subtle)}.jini-data-table tbody tr:hover,.jini-data-table tbody tr:focus-visible{background:var(--jini-surface)}.jini-data-table tbody tr[role=button]{cursor:pointer}.jini-data-table [data-numeric=true]{text-align:right}.jini-data-table-sort{width:100%;min-height:1.5rem;color:inherit;font:inherit;text-align:inherit;cursor:pointer;background:0 0;border:0;justify-content:space-between;align-items:center;gap:.625rem;padding:0;display:inline-flex}.jini-data-table [data-numeric=true] .jini-data-table-sort{justify-content:flex-end}.jini-data-table th[aria-sort=ascending],.jini-data-table th[aria-sort=descending],.jini-data-table-sort:hover{color:var(--jini-text)}.jini-data-table td.jini-data-table-empty{height:8rem;color:var(--jini-muted);text-align:center}.jini-data-table-pagination{border-top:1px solid var(--jini-border);color:var(--jini-muted);font-size:var(--jini-font-size-xs);font-variant-numeric:tabular-nums;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:.75rem;padding:.625rem .875rem;display:flex}.jini-data-table-pagination-controls{gap:.5rem;display:flex}.jini-data-table-pagination button{border:1px solid var(--jini-border);border-radius:var(--jini-radius-sm);background:var(--jini-bg);min-height:2rem;color:var(--jini-text);font:inherit;cursor:pointer;padding:.375rem .75rem}.jini-data-table-pagination button:hover:not(:disabled){background:var(--jini-surface)}.jini-data-table-pagination button:disabled{opacity:.5;cursor:default}.jini-data-table-sort:focus-visible,.jini-data-table-pagination button:focus-visible,.jini-data-table tr[role=button]:focus-visible{outline:2px solid var(--jini-primary);outline-offset:-2px}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}
@@ -1,8 +1,9 @@
1
1
  /**
2
- * Ported verbatim from shadcn's `new-york` style registry (`ui.shadcn.com/r/styles/new-york/button.json`
2
+ * Ported from shadcn's `new-york` style registry (`ui.shadcn.com/r/styles/new-york/button.json`
3
3
  * — the same JSON the CLI's `npx shadcn@latest add button` fetches, 2026-08-18). Only the `cn`
4
4
  * import path changed (`@/lib/utils` -> `./lib/utils.js`), same as `table.tsx`; every class name,
5
- * variant, and prop shape below is unmodified CLI output.
5
+ * variant, and size below is unmodified CLI output.
6
+ * The unused private `asChild` option is omitted: `ActionButton` always renders a button.
6
7
  */
7
8
  import * as React from 'react';
8
9
  import { type VariantProps } from 'class-variance-authority';
@@ -10,9 +11,10 @@ declare const buttonVariants: (props?: ({
10
11
  variant?: "link" | "default" | "ghost" | "outline" | "destructive" | "secondary" | null | undefined;
11
12
  size?: "default" | "icon" | "sm" | "lg" | null | undefined;
12
13
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
13
- export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
14
- asChild?: boolean;
15
- }
16
- declare const Button: React.ForwardRefExoticComponent<ButtonProps & React.RefAttributes<HTMLButtonElement>>;
14
+ export type ButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> & VariantProps<typeof buttonVariants>;
15
+ declare const Button: React.ForwardRefExoticComponent<React.ButtonHTMLAttributes<HTMLButtonElement> & VariantProps<(props?: ({
16
+ variant?: "link" | "default" | "ghost" | "outline" | "destructive" | "secondary" | null | undefined;
17
+ size?: "default" | "icon" | "sm" | "lg" | null | undefined;
18
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string> & React.RefAttributes<HTMLButtonElement>>;
17
19
  export { Button, buttonVariants };
18
20
  //# sourceMappingURL=button.d.ts.map
@@ -1,12 +1,12 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  /**
3
- * Ported verbatim from shadcn's `new-york` style registry (`ui.shadcn.com/r/styles/new-york/button.json`
3
+ * Ported from shadcn's `new-york` style registry (`ui.shadcn.com/r/styles/new-york/button.json`
4
4
  * — the same JSON the CLI's `npx shadcn@latest add button` fetches, 2026-08-18). Only the `cn`
5
5
  * import path changed (`@/lib/utils` -> `./lib/utils.js`), same as `table.tsx`; every class name,
6
- * variant, and prop shape below is unmodified CLI output.
6
+ * variant, and size below is unmodified CLI output.
7
+ * The unused private `asChild` option is omitted: `ActionButton` always renders a button.
7
8
  */
8
9
  import * as React from 'react';
9
- import { Slot } from '@radix-ui/react-slot';
10
10
  import { cva } from 'class-variance-authority';
11
11
  import { cn } from './lib/utils.js';
12
12
  const buttonVariants = cva('inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0', {
@@ -31,9 +31,8 @@ const buttonVariants = cva('inline-flex items-center justify-center gap-2 whites
31
31
  size: 'default',
32
32
  },
33
33
  });
34
- const Button = React.forwardRef(({ className, variant, size, asChild = false, ...props }, ref) => {
35
- const Comp = asChild ? Slot : 'button';
36
- return _jsx(Comp, { className: cn(buttonVariants({ variant, size, className })), ref: ref, ...props });
34
+ const Button = React.forwardRef(({ className, variant, size, ...props }, ref) => {
35
+ return _jsx("button", { className: cn(buttonVariants({ variant, size, className })), ref: ref, ...props });
37
36
  });
38
37
  Button.displayName = 'Button';
39
38
  export { Button, buttonVariants };
@@ -1,6 +1,7 @@
1
1
  /**
2
- * Ported verbatim from shadcn's `new-york` style registry (`ui.shadcn.com/r/styles/new-york/card.json`,
2
+ * Ported from shadcn's `new-york` style registry (`ui.shadcn.com/r/styles/new-york/card.json`,
3
3
  * 2026-08-18). Only the `cn` import path changed, same as `table.tsx`.
4
+ * The unused private footer primitive is omitted.
4
5
  */
5
6
  import * as React from 'react';
6
7
  declare const Card: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
@@ -8,6 +9,5 @@ declare const CardHeader: React.ForwardRefExoticComponent<React.HTMLAttributes<H
8
9
  declare const CardTitle: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
9
10
  declare const CardDescription: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
10
11
  declare const CardContent: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
11
- declare const CardFooter: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
12
- export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent };
12
+ export { Card, CardHeader, CardTitle, CardDescription, CardContent };
13
13
  //# sourceMappingURL=card.d.ts.map
@@ -1,7 +1,8 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  /**
3
- * Ported verbatim from shadcn's `new-york` style registry (`ui.shadcn.com/r/styles/new-york/card.json`,
3
+ * Ported from shadcn's `new-york` style registry (`ui.shadcn.com/r/styles/new-york/card.json`,
4
4
  * 2026-08-18). Only the `cn` import path changed, same as `table.tsx`.
5
+ * The unused private footer primitive is omitted.
5
6
  */
6
7
  import * as React from 'react';
7
8
  import { cn } from './lib/utils.js';
@@ -15,7 +16,5 @@ const CardDescription = React.forwardRef(({ className, ...props }, ref) => (_jsx
15
16
  CardDescription.displayName = 'CardDescription';
16
17
  const CardContent = React.forwardRef(({ className, ...props }, ref) => (_jsx("div", { ref: ref, className: cn('p-6 pt-0', className), ...props })));
17
18
  CardContent.displayName = 'CardContent';
18
- const CardFooter = React.forwardRef(({ className, ...props }, ref) => (_jsx("div", { ref: ref, className: cn('flex items-center p-6 pt-0', className), ...props })));
19
- CardFooter.displayName = 'CardFooter';
20
- export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent };
19
+ export { Card, CardHeader, CardTitle, CardDescription, CardContent };
21
20
  //# sourceMappingURL=card.js.map
@@ -2,6 +2,8 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useMemo, useState } from 'react';
3
3
  import { getNumericColumnKeys, sortTableRows } from '../../table-data.js';
4
4
  import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from './table.js';
5
+ /** Header glyph per column sort state; `none` marks a sortable but unsorted column. */
6
+ const SORT_GLYPHS = { ascending: '↑', descending: '↓', none: '↕' };
5
7
  function resolveTablePage({ pageSize, rowCount, requestedPage }, _options = {}) {
6
8
  const requestedSize = pageSize !== undefined && Number.isInteger(pageSize) && pageSize > 0 ? pageSize : null;
7
9
  const paging = requestedSize !== null;
@@ -20,11 +22,14 @@ export function DataTable({ columns, rows, onRowClick, sortable = true, pageSize
20
22
  const sortedRows = useMemo(() => sortTableRows({ rows, sort: activeSort, numericKeys }), [rows, activeSort, numericKeys]);
21
23
  const { paging, size, pageCount, page, start } = resolveTablePage({ pageSize, rowCount: rows.length, requestedPage });
22
24
  const visibleRows = sortedRows.slice(start, start + size);
23
- return (_jsxs("div", { className: "jini-data-table-frame", "data-table-provider": "shadcn", children: [_jsxs(Table, { className: "jini-data-table", children: [_jsx(TableHeader, { children: _jsx(TableRow, { children: columns.map((column) => (_jsx(TableHead, { scope: "col", "data-numeric": numericKeys.has(column.key), "aria-sort": sortable ? (activeSort?.key === column.key ? activeSort.direction : 'none') : undefined, children: sortable ? (_jsxs("button", { type: "button", className: "jini-data-table-sort", onClick: () => {
24
- setSort({ key: column.key, direction: activeSort?.key === column.key && activeSort.direction === 'ascending'
25
- ? 'descending' : 'ascending' });
26
- setPage(0);
27
- }, children: [_jsx("span", { children: column.label }), _jsx("span", { "aria-hidden": "true", children: activeSort?.key === column.key ? (activeSort.direction === 'ascending' ? '↑' : '↓') : '↕' })] })) : column.label }, column.key))) }) }), _jsxs(TableBody, { children: [rows.length === 0 && _jsx(TableRow, { children: _jsx(TableCell, { className: "jini-data-table-empty", colSpan: columns.length, children: "No results." }) }), visibleRows.map(({ row, index }) => (_jsx(TableRow, { onClick: onRowClick ? () => onRowClick(row, index) : undefined, role: onRowClick ? 'button' : undefined, tabIndex: onRowClick ? 0 : undefined, onKeyDown: onRowClick ? (event) => {
25
+ return (_jsxs("div", { className: "jini-data-table-frame", "data-table-provider": "shadcn", children: [_jsxs(Table, { className: "jini-data-table", children: [_jsx(TableHeader, { children: _jsx(TableRow, { children: columns.map((column) => {
26
+ const columnSort = activeSort?.key === column.key ? activeSort.direction : undefined;
27
+ return (_jsx(TableHead, { scope: "col", "data-numeric": numericKeys.has(column.key), "aria-sort": sortable ? (columnSort ?? 'none') : undefined, children: sortable ? (_jsxs("button", { type: "button", className: "jini-data-table-sort", onClick: () => {
28
+ setSort({ key: column.key, direction: activeSort?.key === column.key && activeSort.direction === 'ascending'
29
+ ? 'descending' : 'ascending' });
30
+ setPage(0);
31
+ }, children: [_jsx("span", { children: column.label }), _jsx("span", { "aria-hidden": "true", children: SORT_GLYPHS[columnSort ?? 'none'] })] })) : column.label }, column.key));
32
+ }) }) }), _jsxs(TableBody, { children: [rows.length === 0 && _jsx(TableRow, { children: _jsx(TableCell, { className: "jini-data-table-empty", colSpan: columns.length, children: "No results." }) }), visibleRows.map(({ row, index }) => (_jsx(TableRow, { onClick: onRowClick ? () => onRowClick(row, index) : undefined, role: onRowClick ? 'button' : undefined, tabIndex: onRowClick ? 0 : undefined, onKeyDown: onRowClick ? (event) => {
28
33
  if (event.target === event.currentTarget && (event.key === 'Enter' || event.key === ' ')) {
29
34
  event.preventDefault();
30
35
  onRowClick(row, index);
@@ -1,19 +1,17 @@
1
1
  /**
2
- * Ported verbatim from shadcn's `new-york` style registry (`ui.shadcn.com/r/styles/new-york/select.json`,
2
+ * Ported from shadcn's `new-york` style registry (`ui.shadcn.com/r/styles/new-york/select.json`,
3
3
  * 2026-08-18). Only the `cn` import path changed, same as `table.tsx`; every class name and
4
4
  * `data-*` attribute below is unmodified CLI output.
5
+ * Unused private group, label, and separator primitives are omitted.
5
6
  */
6
7
  import * as React from 'react';
7
8
  import * as SelectPrimitive from '@radix-ui/react-select';
8
9
  declare const Select: React.FC<SelectPrimitive.SelectProps>;
9
- declare const SelectGroup: React.ForwardRefExoticComponent<SelectPrimitive.SelectGroupProps & React.RefAttributes<HTMLDivElement>>;
10
10
  declare const SelectValue: React.ForwardRefExoticComponent<SelectPrimitive.SelectValueProps & React.RefAttributes<HTMLSpanElement>>;
11
11
  declare const SelectTrigger: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectTriggerProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
12
12
  declare const SelectScrollUpButton: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectScrollUpButtonProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
13
13
  declare const SelectScrollDownButton: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectScrollDownButtonProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
14
14
  declare const SelectContent: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
15
- declare const SelectLabel: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectLabelProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
16
15
  declare const SelectItem: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectItemProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
17
- declare const SelectSeparator: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectSeparatorProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
18
- export { Select, SelectGroup, SelectValue, SelectTrigger, SelectContent, SelectLabel, SelectItem, SelectSeparator, SelectScrollUpButton, SelectScrollDownButton, };
16
+ export { Select, SelectValue, SelectTrigger, SelectContent, SelectItem, SelectScrollUpButton, SelectScrollDownButton, };
19
17
  //# sourceMappingURL=select.d.ts.map
@@ -1,15 +1,15 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  /**
3
- * Ported verbatim from shadcn's `new-york` style registry (`ui.shadcn.com/r/styles/new-york/select.json`,
3
+ * Ported from shadcn's `new-york` style registry (`ui.shadcn.com/r/styles/new-york/select.json`,
4
4
  * 2026-08-18). Only the `cn` import path changed, same as `table.tsx`; every class name and
5
5
  * `data-*` attribute below is unmodified CLI output.
6
+ * Unused private group, label, and separator primitives are omitted.
6
7
  */
7
8
  import * as React from 'react';
8
9
  import * as SelectPrimitive from '@radix-ui/react-select';
9
10
  import { Check, ChevronDown, ChevronUp } from './icons.js';
10
11
  import { cn } from './lib/utils.js';
11
12
  const Select = SelectPrimitive.Root;
12
- const SelectGroup = SelectPrimitive.Group;
13
13
  const SelectValue = SelectPrimitive.Value;
14
14
  const SelectTrigger = React.forwardRef(({ className, children, ...props }, ref) => (_jsxs(SelectPrimitive.Trigger, { ref: ref, className: cn('flex h-9 w-full items-center justify-between whitespace-nowrap rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-background data-[placeholder]:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1', className), ...props, children: [children, _jsx(SelectPrimitive.Icon, { asChild: true, children: _jsx(ChevronDown, { className: "h-4 w-4 opacity-50" }) })] })));
15
15
  SelectTrigger.displayName = SelectPrimitive.Trigger.displayName;
@@ -20,11 +20,7 @@ SelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayNam
20
20
  const SelectContent = React.forwardRef(({ className, children, position = 'popper', ...props }, ref) => (_jsx(SelectPrimitive.Portal, { children: _jsxs(SelectPrimitive.Content, { ref: ref, className: cn('relative z-50 max-h-[--radix-select-content-available-height] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-select-content-transform-origin]', position === 'popper' &&
21
21
  'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1', className), position: position, ...props, children: [_jsx(SelectScrollUpButton, {}), _jsx(SelectPrimitive.Viewport, { className: cn('p-1', position === 'popper' && 'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]'), children: children }), _jsx(SelectScrollDownButton, {})] }) })));
22
22
  SelectContent.displayName = SelectPrimitive.Content.displayName;
23
- const SelectLabel = React.forwardRef(({ className, ...props }, ref) => _jsx(SelectPrimitive.Label, { ref: ref, className: cn('px-2 py-1.5 text-sm font-semibold', className), ...props }));
24
- SelectLabel.displayName = SelectPrimitive.Label.displayName;
25
23
  const SelectItem = React.forwardRef(({ className, children, ...props }, ref) => (_jsxs(SelectPrimitive.Item, { ref: ref, className: cn('relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-2 pr-8 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50', className), ...props, children: [_jsx("span", { className: "absolute right-2 flex h-3.5 w-3.5 items-center justify-center", children: _jsx(SelectPrimitive.ItemIndicator, { children: _jsx(Check, { className: "h-4 w-4" }) }) }), _jsx(SelectPrimitive.ItemText, { children: children })] })));
26
24
  SelectItem.displayName = SelectPrimitive.Item.displayName;
27
- const SelectSeparator = React.forwardRef(({ className, ...props }, ref) => _jsx(SelectPrimitive.Separator, { ref: ref, className: cn('-mx-1 my-1 h-px bg-muted', className), ...props }));
28
- SelectSeparator.displayName = SelectPrimitive.Separator.displayName;
29
- export { Select, SelectGroup, SelectValue, SelectTrigger, SelectContent, SelectLabel, SelectItem, SelectSeparator, SelectScrollUpButton, SelectScrollDownButton, };
25
+ export { Select, SelectValue, SelectTrigger, SelectContent, SelectItem, SelectScrollUpButton, SelectScrollDownButton, };
30
26
  //# sourceMappingURL=select.js.map
@@ -1,17 +1,16 @@
1
1
  /**
2
- * Ported verbatim from `npx shadcn@latest add table` (real CLI run, 2026-08-08, against a
2
+ * Ported from `npx shadcn@latest add table` (real CLI run, 2026-08-08, against a
3
3
  * scratch Vite+Tailwind v4 project — see source-map.md). Only the `cn` import path changed
4
4
  * (`@/lib/utils` -> `./lib/utils.js`, this monorepo's relative-import convention); every
5
- * class name, `data-slot` attribute, and prop shape below is unmodified CLI output.
5
+ * retained class name, `data-slot` attribute, and prop shape below is unmodified CLI output.
6
+ * Unused private footer and caption primitives are omitted.
6
7
  */
7
8
  import * as React from 'react';
8
9
  declare function Table({ className, ...props }: React.ComponentProps<'table'>): React.JSX.Element;
9
10
  declare function TableHeader({ className, ...props }: React.ComponentProps<'thead'>): React.JSX.Element;
10
11
  declare function TableBody({ className, ...props }: React.ComponentProps<'tbody'>): React.JSX.Element;
11
- declare function TableFooter({ className, ...props }: React.ComponentProps<'tfoot'>): React.JSX.Element;
12
12
  declare function TableRow({ className, ...props }: React.ComponentProps<'tr'>): React.JSX.Element;
13
13
  declare function TableHead({ className, ...props }: React.ComponentProps<'th'>): React.JSX.Element;
14
14
  declare function TableCell({ className, ...props }: React.ComponentProps<'td'>): React.JSX.Element;
15
- declare function TableCaption({ className, ...props }: React.ComponentProps<'caption'>): React.JSX.Element;
16
- export { Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption };
15
+ export { Table, TableHeader, TableBody, TableHead, TableRow, TableCell };
17
16
  //# sourceMappingURL=table.d.ts.map
@@ -1,9 +1,10 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  /**
3
- * Ported verbatim from `npx shadcn@latest add table` (real CLI run, 2026-08-08, against a
3
+ * Ported from `npx shadcn@latest add table` (real CLI run, 2026-08-08, against a
4
4
  * scratch Vite+Tailwind v4 project — see source-map.md). Only the `cn` import path changed
5
5
  * (`@/lib/utils` -> `./lib/utils.js`, this monorepo's relative-import convention); every
6
- * class name, `data-slot` attribute, and prop shape below is unmodified CLI output.
6
+ * retained class name, `data-slot` attribute, and prop shape below is unmodified CLI output.
7
+ * Unused private footer and caption primitives are omitted.
7
8
  */
8
9
  import * as React from 'react';
9
10
  import { cn } from './lib/utils.js';
@@ -16,9 +17,6 @@ function TableHeader({ className, ...props }) {
16
17
  function TableBody({ className, ...props }) {
17
18
  return _jsx("tbody", { "data-slot": "table-body", className: cn('[&_tr:last-child]:border-0', className), ...props });
18
19
  }
19
- function TableFooter({ className, ...props }) {
20
- return (_jsx("tfoot", { "data-slot": "table-footer", className: cn('border-t bg-muted/50 font-medium [&>tr]:last:border-b-0', className), ...props }));
21
- }
22
20
  function TableRow({ className, ...props }) {
23
21
  return (_jsx("tr", { "data-slot": "table-row", className: cn('border-b transition-colors hover:bg-muted/50 has-aria-expanded:bg-muted/50 data-[state=selected]:bg-muted', className), ...props }));
24
22
  }
@@ -28,8 +26,5 @@ function TableHead({ className, ...props }) {
28
26
  function TableCell({ className, ...props }) {
29
27
  return (_jsx("td", { "data-slot": "table-cell", className: cn('p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0', className), ...props }));
30
28
  }
31
- function TableCaption({ className, ...props }) {
32
- return _jsx("caption", { "data-slot": "table-caption", className: cn('mt-4 text-sm text-muted-foreground', className), ...props });
33
- }
34
- export { Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption };
29
+ export { Table, TableHeader, TableBody, TableHead, TableRow, TableCell };
35
30
  //# sourceMappingURL=table.js.map
@@ -1,7 +1,7 @@
1
1
  function isNumericValue(value) {
2
2
  if (typeof value === 'number')
3
3
  return Number.isFinite(value);
4
- return typeof value === 'string' && /^[+-]?(?:\d+\.?\d*|\.\d+)(?:e[+-]?\d+)?$/i.test(value.trim())
4
+ return typeof value === 'string' && /^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$/i.test(value.trim())
5
5
  && Number.isFinite(Number(value));
6
6
  }
7
7
  /** Infer numeric columns once for both providers; empty cells do not turn a numeric column into text.
@@ -37,10 +37,10 @@ export function setRichTextFromPlainText(editor, text, knownMentions) {
37
37
  label: part.entity.label,
38
38
  title: part.entity.title,
39
39
  }));
40
+ continue;
40
41
  }
41
- else if (part.text) {
42
+ if (part.text)
42
43
  p.append($createTextNode(part.text));
43
- }
44
44
  }
45
45
  });
46
46
  root.append(p);
@@ -232,10 +232,10 @@ export function foldPresentMentions(text, present, known) {
232
232
  if (part.kind !== 'mention' || part.entity.kind === 'unknown')
233
233
  continue;
234
234
  const key = `${part.entity.kind}:${part.entity.id}`;
235
- if (seen.has(key))
236
- continue;
237
- seen.add(key);
238
- result.push(part.entity);
235
+ if (!seen.has(key)) {
236
+ seen.add(key);
237
+ result.push(part.entity);
238
+ }
239
239
  }
240
240
  return result;
241
241
  }
@@ -68,6 +68,7 @@ function EditorSurface(props, ref) {
68
68
  }, { discrete: true });
69
69
  },
70
70
  insertMention(insert) {
71
+ const isActiveTrigger = (trigger) => trigger.id === mentionTriggerIdRef.current;
71
72
  editor.update(() => {
72
73
  let sel = $getSelection();
73
74
  if (!$isRangeSelection(sel)) {
@@ -80,7 +81,7 @@ function EditorSurface(props, ref) {
80
81
  // The cast documents that instead of an unreachable
81
82
  // early-return branch no real document state can trigger.
82
83
  const rangeSel = sel;
83
- const mentionTrigger = triggersRef.current.find((t) => t.id === mentionTriggerIdRef.current) ??
84
+ const mentionTrigger = triggersRef.current.find(isActiveTrigger) ??
84
85
  triggersRef.current[0];
85
86
  if (mentionTrigger) {
86
87
  deleteActiveTrigger(rangeSel, buildTriggerDeletionRegex(mentionTrigger));
@@ -30,7 +30,7 @@ export function useCaretFloatingLayerPosition(caret, open, boundaryRef) {
30
30
  }, [open, caret, reposition]);
31
31
  useEffect(() => {
32
32
  if (!open)
33
- return;
33
+ return undefined;
34
34
  let raf = 0;
35
35
  const onMove = () => {
36
36
  if (raf)
@@ -23,7 +23,7 @@ export function useMentionColorStamping(resolveMentionColor) {
23
23
  const [editor] = useLexicalComposerContext();
24
24
  useEffect(() => {
25
25
  if (!resolveMentionColor)
26
- return;
26
+ return undefined;
27
27
  const stampByKey = (key) => {
28
28
  const dom = editor.getElementByKey(key);
29
29
  if (!dom)
@@ -26,17 +26,20 @@ export function serializeRichText(state) {
26
26
  function serializeParagraph(at) {
27
27
  let line = '';
28
28
  for (const child of at.paragraph.getChildren()) {
29
- if ($isMentionNode(child)) {
30
- line += child.getToken();
31
- at.mentions.push(child.getEntity());
32
- }
33
- else if ($isLineBreakNode(child)) {
34
- line += '\n';
35
- }
36
- else if ($isTextNode(child) || $isElementNode(child)) {
37
- line += child.getTextContent();
38
- }
29
+ line += serializedChildText(child, at.mentions);
39
30
  }
40
31
  return line;
41
32
  }
33
+ /** One paragraph child's plain-text contribution; a mention also records its entity. Other node kinds add nothing. */
34
+ function serializedChildText(child, mentions) {
35
+ if ($isMentionNode(child)) {
36
+ mentions.push(child.getEntity());
37
+ return child.getToken();
38
+ }
39
+ if ($isLineBreakNode(child))
40
+ return '\n';
41
+ if ($isTextNode(child) || $isElementNode(child))
42
+ return child.getTextContent();
43
+ return '';
44
+ }
42
45
  //# sourceMappingURL=serialize.js.map
@@ -18,6 +18,6 @@ export function ListDetailPanel({ items, selectedId, onSelect, renderItem, rende
18
18
  const state = { active };
19
19
  const resolvedItemClassName = typeof itemClassName === 'function' ? itemClassName(item, state) : itemClassName;
20
20
  return (_jsx("button", { type: "button", className: join('jini-list-detail-panel-item', active && 'jini-list-detail-panel-item-active', resolvedItemClassName), "aria-pressed": active, "aria-label": getItemAriaLabel?.(item), "data-active": active, "data-testid": `${testId}-item-${item.id}`, onClick: () => onSelect(item.id), children: renderItem(item, state) }, item.id));
21
- }) }))] }), _jsx("section", { className: join('jini-list-detail-panel-detail', detailClassName), "data-testid": `${testId}-detail`, children: loading ? (_jsx("div", { className: "jini-list-detail-panel-loading-detail", role: "status", "aria-busy": "true", "aria-label": t('Loading'), "data-testid": `${testId}-loading-detail`, children: loadingDetailContent })) : selectedItem ? (renderDetail(selectedItem)) : (emptyDetailContent) })] }));
21
+ }) }))] }), _jsxs("section", { className: join('jini-list-detail-panel-detail', detailClassName), "data-testid": `${testId}-detail`, children: [loading ? (_jsx("div", { className: "jini-list-detail-panel-loading-detail", role: "status", "aria-busy": "true", "aria-label": t('Loading'), "data-testid": `${testId}-loading-detail`, children: loadingDetailContent })) : null, !loading && selectedItem ? renderDetail(selectedItem) : null, !loading && !selectedItem ? emptyDetailContent : null] })] }));
22
22
  }
23
23
  //# sourceMappingURL=ListDetailPanel.js.map
@@ -1,3 +1,4 @@
1
+ import { trimTrailingChars } from '../../utils/trim-chars.js';
1
2
  /**
2
3
  * @module features/mcp-ui/confirmation-store
3
4
  *
@@ -66,11 +67,7 @@ function bindingsMatch(minted, presented) {
66
67
  // does not — the type check below is what keeps those apart, and it is exact on purpose: a
67
68
  // binding that silently coerces is a binding that can be satisfied by a value the minter never
68
69
  // agreed to.
69
- if (typeof left !== typeof right) {
70
- matched = false;
71
- continue;
72
- }
73
- if (!constantTimeEquals(String(left), String(right)))
70
+ if (typeof left !== typeof right || !constantTimeEquals(String(left), String(right)))
74
71
  matched = false;
75
72
  }
76
73
  return matched;
@@ -89,7 +86,7 @@ function defaultRandomToken() {
89
86
  let binary = '';
90
87
  for (const byte of bytes)
91
88
  binary += String.fromCharCode(byte);
92
- return btoa(binary).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
89
+ return trimTrailingChars(btoa(binary).replace(/\+/g, '-').replace(/\//g, '_'), '=');
93
90
  }
94
91
  /**
95
92
  * Creates an in-process confirmation store.
@@ -67,6 +67,11 @@ export interface ConfirmationSurfaceSpec {
67
67
  readonly description?: string;
68
68
  /** The facts being agreed about. A dialog that says "delete this?" without naming *this* is not consent. */
69
69
  readonly details?: readonly SurfaceDetail[];
70
+ /** Technical identifiers and input stay available without crowding out the consent wording. */
71
+ readonly detailDisclosure?: {
72
+ readonly label: string;
73
+ readonly details: readonly SurfaceDetail[];
74
+ };
70
75
  /**
71
76
  * Optional per-row checkboxes, rendered unchecked between the details and the warning. Ticking one
72
77
  * never confirms anything by itself — the same property the module doc opens with, extended to a