@zendir/ui 0.3.0 → 0.4.0

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 (116) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/index.js +67 -62
  3. package/dist/index.js.map +1 -1
  4. package/dist/react/3d/ZenSpace3D.js +3 -2
  5. package/dist/react/3d/ZenSpace3DShaders.js +478 -0
  6. package/dist/react/3d/ZenSpace3DShaders.js.map +1 -0
  7. package/dist/react/3d/capturePngAnalysis.js +42 -0
  8. package/dist/react/3d/capturePngAnalysis.js.map +1 -0
  9. package/dist/react/3d/index.js +57 -0
  10. package/dist/react/3d/index.js.map +1 -0
  11. package/dist/react/3d/threeLoader.js +4 -0
  12. package/dist/react/3d/threeLoader.js.map +1 -1
  13. package/dist/react/astro/ClassificationBanner.js +1 -1
  14. package/dist/react/astro/GlobalStatusBar.js +1 -1
  15. package/dist/react/astro/MissionClock.js +8 -5
  16. package/dist/react/astro/MissionClock.js.map +1 -1
  17. package/dist/react/astro/MonitoringIcon.js +1 -1
  18. package/dist/react/astro/Notification.js +1 -1
  19. package/dist/react/astro/Progress.js +1 -1
  20. package/dist/react/astro/SimulationControls.js +1 -1
  21. package/dist/react/astro/StatusIndicator.js +1 -1
  22. package/dist/react/astro/UnifiedTimeline.js +1 -1
  23. package/dist/react/astro/index.js +34 -0
  24. package/dist/react/astro/index.js.map +1 -0
  25. package/dist/react/cards/AccessCard.js +410 -0
  26. package/dist/react/cards/AccessCard.js.map +1 -0
  27. package/dist/react/cards/OrbitCard.js +372 -0
  28. package/dist/react/cards/OrbitCard.js.map +1 -0
  29. package/dist/react/cards/SpacecraftCard.js +941 -0
  30. package/dist/react/cards/SpacecraftCard.js.map +1 -0
  31. package/dist/react/cards/TelemetryCard.js +742 -0
  32. package/dist/react/cards/TelemetryCard.js.map +1 -0
  33. package/dist/react/cards/TelemetryStreamCard.js +309 -0
  34. package/dist/react/cards/TelemetryStreamCard.js.map +1 -0
  35. package/dist/react/cards/index.js +13 -0
  36. package/dist/react/cards/index.js.map +1 -0
  37. package/dist/react/charts/GroundTrackMap.js +1 -1
  38. package/dist/react/charts/GroundTrackMapLeaflet.js +1 -1
  39. package/dist/react/charts/index.js +104 -0
  40. package/dist/react/charts/index.js.map +1 -0
  41. package/dist/react/charts/unified/AstroChart.js +1 -1
  42. package/dist/react/charts/unified/PowerOverviewChart.js +488 -0
  43. package/dist/react/charts/unified/PowerOverviewChart.js.map +1 -0
  44. package/dist/react/charts/unified/domain.js +3168 -0
  45. package/dist/react/charts/unified/domain.js.map +1 -0
  46. package/dist/react/charts/unified/generators.js +518 -0
  47. package/dist/react/charts/unified/generators.js.map +1 -0
  48. package/dist/react/charts/unified/presets.js +1000 -0
  49. package/dist/react/charts/unified/presets.js.map +1 -0
  50. package/dist/react/charts/unified/sync.js +219 -0
  51. package/dist/react/charts/unified/sync.js.map +1 -0
  52. package/dist/react/charts/unified/theme.js +331 -4
  53. package/dist/react/charts/unified/theme.js.map +1 -1
  54. package/dist/react/charts/unified/useChartStream.js +226 -0
  55. package/dist/react/charts/unified/useChartStream.js.map +1 -0
  56. package/dist/react/chatgpt/index.js +163 -0
  57. package/dist/react/chatgpt/index.js.map +1 -0
  58. package/dist/react/core/data/DataTable.js +1 -1
  59. package/dist/react/core/data/DataValue.js +1 -1
  60. package/dist/react/core/display/AstroIcon.js +1 -1
  61. package/dist/react/core/display/Badge.js +1 -1
  62. package/dist/react/core/display/CardHeader.js +1 -1
  63. package/dist/react/core/display/Container.js +1 -1
  64. package/dist/react/core/display/GlassCard.js +1 -1
  65. package/dist/react/core/display/HeaderIconWithStatus.js +1 -1
  66. package/dist/react/core/feedback/Dialog.js +24 -21
  67. package/dist/react/core/feedback/Dialog.js.map +1 -1
  68. package/dist/react/core/feedback/Toast.js +1 -1
  69. package/dist/react/core/index.d.ts +4 -0
  70. package/dist/react/core/index.js +166 -0
  71. package/dist/react/core/index.js.map +1 -0
  72. package/dist/react/core/inputs/Button.js +1 -1
  73. package/dist/react/core/inputs/Checkbox.js +1 -1
  74. package/dist/react/core/inputs/Input.js +1 -1
  75. package/dist/react/core/inputs/NumberInput.js +1 -1
  76. package/dist/react/core/inputs/PinInput.js +1 -1
  77. package/dist/react/core/inputs/Select.js +1 -1
  78. package/dist/react/core/inputs/Toggle.js +1 -1
  79. package/dist/react/core/layout/Box.js +1 -1
  80. package/dist/react/core/layout/Flex.js +1 -1
  81. package/dist/react/core/layout/Grid.js +1 -1
  82. package/dist/react/core/layout/Stack.js +1 -1
  83. package/dist/react/core/navigation/AppBar.js +1 -1
  84. package/dist/react/core/navigation/Pagination.js +1 -1
  85. package/dist/react/core/navigation/SideNav.js +1 -1
  86. package/dist/react/core/navigation/SideNav.js.map +1 -1
  87. package/dist/react/core/navigation/Tabs.js +1 -1
  88. package/dist/react/core/overlays/SidePanel.js +1 -1
  89. package/dist/react/core/overlays/Tooltip.js +1 -1
  90. package/dist/react/core/widgets/Capture.js +1 -1
  91. package/dist/react/core/widgets/ChatPanel.js +1 -1
  92. package/dist/react/core/widgets/ColorPickerPanel.js +1 -1
  93. package/dist/react/core/widgets/ConnectionForm.js +1 -1
  94. package/dist/react/core/widgets/FileExplorer.js +1 -1
  95. package/dist/react/core/widgets/ImageFrame.d.ts +51 -0
  96. package/dist/react/core/widgets/ImageFrame.js +201 -0
  97. package/dist/react/core/widgets/ImageFrame.js.map +1 -0
  98. package/dist/react/core/widgets/ImageGallery.js +1 -1
  99. package/dist/react/core/widgets/ImagePanel.d.ts +43 -0
  100. package/dist/react/core/widgets/ImagePanel.js +105 -0
  101. package/dist/react/core/widgets/ImagePanel.js.map +1 -0
  102. package/dist/react/core/widgets/MessageStream.js +1 -1
  103. package/dist/react/core/widgets/MissionCalendar.js +1 -1
  104. package/dist/react/hooks/useCompactMode.js +1 -1
  105. package/dist/react/index.d.ts +2 -2
  106. package/dist/react/panels/index.js +8 -0
  107. package/dist/react/panels/index.js.map +1 -0
  108. package/dist/react/theme/config.js +30 -0
  109. package/dist/react/theme/config.js.map +1 -0
  110. package/dist/react/theme/index.js +19 -0
  111. package/dist/react/theme/index.js.map +1 -0
  112. package/dist/react/utils/index.js +8 -0
  113. package/dist/react/utils/index.js.map +1 -1
  114. package/dist/react.js +67 -62
  115. package/dist/react.js.map +1 -1
  116. package/package.json +46 -38
@@ -1 +1 @@
1
- {"version":3,"file":"Dialog.js","sources":["../../../../src/react/core/feedback/Dialog.tsx"],"sourcesContent":["/**\n * @zendir/ui - Dialog/Modal Component\n * \n * Modal dialog following Astro UX Design System.\n * \n * @example\n * ```tsx\n * <Dialog\n * open={isOpen}\n * onClose={() => setIsOpen(false)}\n * title=\"Confirm Action\"\n * >\n * <p>Are you sure you want to proceed?</p>\n * <Dialog.Actions>\n * <Button variant=\"secondary\" onClick={() => setIsOpen(false)}>Cancel</Button>\n * <Button onClick={handleConfirm}>Confirm</Button>\n * </Dialog.Actions>\n * </Dialog>\n * ```\n */\n\nimport React, { memo, useEffect, useRef, useCallback, useId } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useTheme } from '../../theme';\nimport { classNames } from '../../utils';\n\nexport type DialogSize = 'small' | 'medium' | 'large' | 'fullscreen';\n\nexport interface DialogProps {\n /** Open state */\n open: boolean;\n /** Close handler */\n onClose: () => void;\n /** Dialog title */\n title?: string;\n /** Size variant */\n size?: DialogSize;\n /** Show close button */\n showCloseButton?: boolean;\n /** Close on backdrop click */\n closeOnBackdropClick?: boolean;\n /** Close on escape key */\n closeOnEscape?: boolean;\n /** Children */\n children: React.ReactNode;\n /** Custom className */\n className?: string;\n}\n\nexport interface DialogActionsProps {\n children: React.ReactNode;\n align?: 'left' | 'center' | 'right';\n}\n\nconst DialogActions = memo(function DialogActions({\n children,\n align = 'right',\n}: DialogActionsProps): React.ReactElement {\n const { tokens } = useTheme();\n \n return (\n <div\n style={{\n display: 'flex',\n justifyContent: align === 'left' ? 'flex-start' : align === 'right' ? 'flex-end' : 'center',\n gap: tokens.spacing.sm,\n marginTop: tokens.spacing.lg,\n paddingTop: tokens.spacing.md,\n borderTop: tokens.borders.divider,\n }}\n >\n {children}\n </div>\n );\n});\n\nexport const Dialog = memo(function Dialog({\n open,\n onClose,\n title,\n size = 'medium',\n showCloseButton = true,\n closeOnBackdropClick = true,\n closeOnEscape = true,\n children,\n className = '',\n}: DialogProps): React.ReactElement | null {\n const { tokens, theme } = useTheme();\n const isTransparentTheme = theme === 'transparent' || theme === 'transparent-bold' || theme === 'transparent-minimal';\n const dialogRef = useRef<HTMLDivElement>(null);\n const previousActiveElement = useRef<HTMLElement | null>(null);\n const titleId = useId();\n const DIALOG_Z_INDEX = 2147483000;\n \n const sizeConfig = {\n small: { width: 'min(360px, calc(100vw - 32px))', maxHeight: '80vh' },\n medium: { width: 'min(540px, calc(100vw - 32px))', maxHeight: '80vh' },\n large: { width: 'min(800px, calc(100vw - 32px))', maxHeight: '90vh' },\n fullscreen: { width: '100vw', maxHeight: '100vh' },\n };\n const config = sizeConfig[size];\n \n // Handle escape key\n const handleKeyDown = useCallback((e: KeyboardEvent) => {\n if (closeOnEscape && e.key === 'Escape') {\n onClose();\n }\n }, [closeOnEscape, onClose]);\n \n // Focus trap and escape key\n useEffect(() => {\n if (open) {\n previousActiveElement.current = document.activeElement as HTMLElement;\n document.body.style.overflow = 'hidden';\n document.addEventListener('keydown', handleKeyDown);\n \n // Focus first focusable element\n const focusTimer = setTimeout(() => {\n const focusable = dialogRef.current?.querySelector<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n focusable?.focus();\n }, 0);\n \n return () => {\n clearTimeout(focusTimer);\n document.body.style.overflow = '';\n document.removeEventListener('keydown', handleKeyDown);\n previousActiveElement.current?.focus();\n };\n }\n }, [open, handleKeyDown]);\n \n if (!open) return null;\n if (typeof document === 'undefined') return null;\n\n return createPortal((\n <div\n className={classNames('zendir-dialog-backdrop', className)}\n onClick={closeOnBackdropClick ? onClose : undefined}\n style={{\n position: 'fixed',\n inset: 0,\n backgroundColor: isTransparentTheme ? `${tokens.colors.background.base}66` : `${tokens.colors.background.base}99`,\n backdropFilter: isTransparentTheme ? 'blur(4px)' : undefined,\n WebkitBackdropFilter: isTransparentTheme ? 'blur(4px)' : undefined,\n display: 'flex',\n alignItems: size === 'fullscreen' ? 'stretch' : 'center',\n justifyContent: 'center',\n zIndex: DIALOG_Z_INDEX,\n animation: `zendir-dialog-backdrop ${tokens.animation.duration.normal}ms ${tokens.animation.easing.default} both`,\n }}\n >\n <div\n ref={dialogRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n className=\"zendir-dialog\"\n onClick={(e) => e.stopPropagation()}\n style={{\n width: config.width,\n maxWidth: size === 'fullscreen' ? '100vw' : 'calc(100vw - 32px)',\n maxHeight: config.maxHeight,\n backgroundColor: isTransparentTheme ? 'rgba(139, 92, 246, 0.08)' : tokens.colors.background.surface,\n ...(isTransparentTheme && { backdropFilter: 'blur(16px)', WebkitBackdropFilter: 'blur(16px)', border: '1px solid rgba(139, 92, 246, 0.2)' }),\n borderRadius: size === 'fullscreen' ? 0 : tokens.borderRadius.lg,\n boxShadow: tokens.shadows.xl,\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n animation: `zendir-dialog-panel ${tokens.animation.duration.normal}ms ${tokens.animation.easing.default} both`,\n }}\n >\n {/* Header */}\n {(title || showCloseButton) && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: `${tokens.spacing.md} ${tokens.spacing.lg}`,\n borderBottom: tokens.borders.divider,\n }}\n >\n {title && (\n <h2\n id={titleId}\n style={{\n margin: 0,\n fontSize: tokens.typography.fontSize.lg,\n fontWeight: tokens.typography.fontWeight.semibold,\n color: tokens.colors.text.primary,\n }}\n >\n {title}\n </h2>\n )}\n {showCloseButton && (\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Close dialog\"\n style={{\n padding: tokens.spacing.sm,\n minWidth: 44,\n minHeight: 44,\n backgroundColor: 'transparent',\n border: 'none',\n borderRadius: tokens.borderRadius.sm,\n cursor: 'pointer',\n color: tokens.colors.text.muted ?? tokens.colors.text.tertiary,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: `color ${tokens.animation.fast}`,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.color = tokens.colors.text.primary;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.color = tokens.colors.text.muted ?? tokens.colors.text.tertiary;\n }}\n >\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\n </svg>\n </button>\n )}\n </div>\n )}\n \n {/* Content */}\n <div\n style={{\n flex: 1,\n padding: tokens.spacing.lg,\n overflow: 'auto',\n }}\n >\n {children}\n </div>\n </div>\n \n <style>\n {`\n @keyframes zendir-dialog-backdrop { from { opacity: 0; } to { opacity: 1; } }\n @keyframes zendir-dialog-panel { from { transform: scale(0.96); opacity: 0; } to { transform: scale(1); opacity: 1; } }\n `}\n </style>\n </div>\n ), document.body);\n}) as React.NamedExoticComponent<DialogProps> & {\n Actions: typeof DialogActions;\n};\n\n// Attach subcomponent\n(Dialog as any).Actions = DialogActions;\n\nexport default Dialog;\n"],"names":["DialogActions","Dialog"],"mappings":"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"}
1
+ {"version":3,"file":"Dialog.js","sources":["../../../../src/react/core/feedback/Dialog.tsx"],"sourcesContent":["/**\n * @zendir/ui - Dialog/Modal Component\n * \n * Modal dialog following Astro UX Design System.\n * \n * @example\n * ```tsx\n * <Dialog\n * open={isOpen}\n * onClose={() => setIsOpen(false)}\n * title=\"Confirm Action\"\n * >\n * <p>Are you sure you want to proceed?</p>\n * <Dialog.Actions>\n * <Button variant=\"secondary\" onClick={() => setIsOpen(false)}>Cancel</Button>\n * <Button onClick={handleConfirm}>Confirm</Button>\n * </Dialog.Actions>\n * </Dialog>\n * ```\n */\n\nimport React, { memo, useEffect, useRef, useCallback, useId } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useTheme } from '../../theme';\nimport { classNames } from '../../utils';\n\nexport type DialogSize = 'small' | 'medium' | 'large' | 'fullscreen';\n\nexport interface DialogProps {\n /** Open state */\n open: boolean;\n /** Close handler */\n onClose: () => void;\n /** Dialog title */\n title?: string;\n /** Size variant */\n size?: DialogSize;\n /** Show close button */\n showCloseButton?: boolean;\n /** Close on backdrop click */\n closeOnBackdropClick?: boolean;\n /** Close on escape key */\n closeOnEscape?: boolean;\n /** Children */\n children: React.ReactNode;\n /** Custom className */\n className?: string;\n}\n\nexport interface DialogActionsProps {\n children: React.ReactNode;\n align?: 'left' | 'center' | 'right';\n}\n\nconst DialogActions = memo(function DialogActions({\n children,\n align = 'right',\n}: DialogActionsProps): React.ReactElement {\n const { tokens } = useTheme();\n \n return (\n <div\n style={{\n display: 'flex',\n justifyContent: align === 'left' ? 'flex-start' : align === 'right' ? 'flex-end' : 'center',\n gap: tokens.spacing.sm,\n marginTop: tokens.spacing.lg,\n paddingTop: tokens.spacing.md,\n borderTop: tokens.borders.divider,\n }}\n >\n {children}\n </div>\n );\n});\n\nexport const Dialog = memo(function Dialog({\n open,\n onClose,\n title,\n size = 'medium',\n showCloseButton = true,\n closeOnBackdropClick = true,\n closeOnEscape = true,\n children,\n className = '',\n}: DialogProps): React.ReactElement | null {\n const { tokens, theme } = useTheme();\n const isTransparentTheme = theme === 'transparent' || theme === 'transparent-bold' || theme === 'transparent-minimal';\n const dialogRef = useRef<HTMLDivElement>(null);\n const previousActiveElement = useRef<HTMLElement | null>(null);\n const titleId = useId();\n const DIALOG_Z_INDEX = 2147483000;\n \n const sizeConfig = {\n small: { width: 'min(360px, calc(100vw - 32px))', maxHeight: '80vh' },\n medium: { width: 'min(540px, calc(100vw - 32px))', maxHeight: '80vh' },\n large: { width: 'min(800px, calc(100vw - 32px))', maxHeight: '90vh' },\n fullscreen: { width: '100vw', maxHeight: '100vh' },\n };\n const config = sizeConfig[size];\n \n // Handle escape key. Kept in a ref so the focus-trap effect below can\n // depend on `open` ALONE: if the effect re-ran whenever `onClose` changed\n // identity (e.g. a parent passing an inline arrow that re-renders on a\n // status poll), it would re-fire the focus() call on every render and pull\n // focus out of whatever the user was typing — making inputs untypable.\n const handleKeyDown = useCallback((e: KeyboardEvent) => {\n if (closeOnEscape && e.key === 'Escape') {\n onClose();\n }\n }, [closeOnEscape, onClose]);\n const handleKeyDownRef = useRef(handleKeyDown);\n handleKeyDownRef.current = handleKeyDown;\n\n // Focus trap and escape key — runs only on open/close transitions.\n useEffect(() => {\n if (!open) return undefined;\n\n previousActiveElement.current = document.activeElement as HTMLElement;\n document.body.style.overflow = 'hidden';\n const onKeyDown = (e: KeyboardEvent) => handleKeyDownRef.current(e);\n document.addEventListener('keydown', onKeyDown);\n\n // Move focus into the dialog once — but honour a child that already\n // grabbed it (e.g. an Input with autoFocus). Without this guard we'd\n // override the intended initial focus and land on the first focusable,\n // which is usually the close button.\n const focusTimer = setTimeout(() => {\n if (dialogRef.current?.contains(document.activeElement)) return;\n const focusable = dialogRef.current?.querySelector<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n focusable?.focus();\n }, 0);\n\n return () => {\n clearTimeout(focusTimer);\n document.body.style.overflow = '';\n document.removeEventListener('keydown', onKeyDown);\n previousActiveElement.current?.focus();\n };\n }, [open]);\n \n if (!open) return null;\n if (typeof document === 'undefined') return null;\n\n return createPortal((\n <div\n className={classNames('zendir-dialog-backdrop', className)}\n onClick={closeOnBackdropClick ? onClose : undefined}\n style={{\n position: 'fixed',\n inset: 0,\n backgroundColor: isTransparentTheme ? `${tokens.colors.background.base}66` : `${tokens.colors.background.base}99`,\n backdropFilter: isTransparentTheme ? 'blur(4px)' : undefined,\n WebkitBackdropFilter: isTransparentTheme ? 'blur(4px)' : undefined,\n display: 'flex',\n alignItems: size === 'fullscreen' ? 'stretch' : 'center',\n justifyContent: 'center',\n zIndex: DIALOG_Z_INDEX,\n animation: `zendir-dialog-backdrop ${tokens.animation.duration.normal}ms ${tokens.animation.easing.default} both`,\n }}\n >\n <div\n ref={dialogRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n className=\"zendir-dialog\"\n onClick={(e) => e.stopPropagation()}\n style={{\n width: config.width,\n maxWidth: size === 'fullscreen' ? '100vw' : 'calc(100vw - 32px)',\n maxHeight: config.maxHeight,\n backgroundColor: isTransparentTheme ? 'rgba(139, 92, 246, 0.08)' : tokens.colors.background.surface,\n ...(isTransparentTheme && { backdropFilter: 'blur(16px)', WebkitBackdropFilter: 'blur(16px)', border: '1px solid rgba(139, 92, 246, 0.2)' }),\n borderRadius: size === 'fullscreen' ? 0 : tokens.borderRadius.lg,\n boxShadow: tokens.shadows.xl,\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n animation: `zendir-dialog-panel ${tokens.animation.duration.normal}ms ${tokens.animation.easing.default} both`,\n }}\n >\n {/* Header */}\n {(title || showCloseButton) && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: `${tokens.spacing.md} ${tokens.spacing.lg}`,\n borderBottom: tokens.borders.divider,\n }}\n >\n {title && (\n <h2\n id={titleId}\n style={{\n margin: 0,\n fontSize: tokens.typography.fontSize.lg,\n fontWeight: tokens.typography.fontWeight.semibold,\n color: tokens.colors.text.primary,\n }}\n >\n {title}\n </h2>\n )}\n {showCloseButton && (\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Close dialog\"\n style={{\n padding: tokens.spacing.sm,\n minWidth: 44,\n minHeight: 44,\n backgroundColor: 'transparent',\n border: 'none',\n borderRadius: tokens.borderRadius.sm,\n cursor: 'pointer',\n color: tokens.colors.text.muted ?? tokens.colors.text.tertiary,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: `color ${tokens.animation.fast}`,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.color = tokens.colors.text.primary;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.color = tokens.colors.text.muted ?? tokens.colors.text.tertiary;\n }}\n >\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\n </svg>\n </button>\n )}\n </div>\n )}\n \n {/* Content */}\n <div\n style={{\n flex: 1,\n padding: tokens.spacing.lg,\n overflow: 'auto',\n }}\n >\n {children}\n </div>\n </div>\n \n <style>\n {`\n @keyframes zendir-dialog-backdrop { from { opacity: 0; } to { opacity: 1; } }\n @keyframes zendir-dialog-panel { from { transform: scale(0.96); opacity: 0; } to { transform: scale(1); opacity: 1; } }\n `}\n </style>\n </div>\n ), document.body);\n}) as React.NamedExoticComponent<DialogProps> & {\n Actions: typeof DialogActions;\n};\n\n// Attach subcomponent\n(Dialog as any).Actions = DialogActions;\n\nexport default Dialog;\n"],"names":["DialogActions","Dialog"],"mappings":";;;;;AAsDA,MAAM,gBAAgB,KAAK,SAASA,eAAc;AAAA,EAChD;AAAA,EACA,QAAQ;AACV,GAA2C;AACzC,QAAM,EAAE,OAAA,IAAW,SAAA;AAEnB,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,gBAAgB,UAAU,SAAS,eAAe,UAAU,UAAU,aAAa;AAAA,QACnF,KAAK,OAAO,QAAQ;AAAA,QACpB,WAAW,OAAO,QAAQ;AAAA,QAC1B,YAAY,OAAO,QAAQ;AAAA,QAC3B,WAAW,OAAO,QAAQ;AAAA,MAAA;AAAA,MAG3B;AAAA,IAAA;AAAA,EAAA;AAGP,CAAC;AAEM,MAAM,SAAS,KAAK,SAASC,QAAO;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,kBAAkB;AAAA,EAClB,uBAAuB;AAAA,EACvB,gBAAgB;AAAA,EAChB;AAAA,EACA,YAAY;AACd,GAA2C;AACzC,QAAM,EAAE,QAAQ,MAAA,IAAU,SAAA;AAC1B,QAAM,qBAAqB,UAAU,iBAAiB,UAAU,sBAAsB,UAAU;AAChG,QAAM,YAAY,OAAuB,IAAI;AAC7C,QAAM,wBAAwB,OAA2B,IAAI;AAC7D,QAAM,UAAU,MAAA;AAChB,QAAM,iBAAiB;AAEvB,QAAM,aAAa;AAAA,IACjB,OAAO,EAAE,OAAO,kCAAkC,WAAW,OAAA;AAAA,IAC7D,QAAQ,EAAE,OAAO,kCAAkC,WAAW,OAAA;AAAA,IAC9D,OAAO,EAAE,OAAO,kCAAkC,WAAW,OAAA;AAAA,IAC7D,YAAY,EAAE,OAAO,SAAS,WAAW,QAAA;AAAA,EAAQ;AAEnD,QAAM,SAAS,WAAW,IAAI;AAO9B,QAAM,gBAAgB,YAAY,CAAC,MAAqB;AACtD,QAAI,iBAAiB,EAAE,QAAQ,UAAU;AACvC,cAAA;AAAA,IACF;AAAA,EACF,GAAG,CAAC,eAAe,OAAO,CAAC;AAC3B,QAAM,mBAAmB,OAAO,aAAa;AAC7C,mBAAiB,UAAU;AAG3B,YAAU,MAAM;AACd,QAAI,CAAC,KAAM,QAAO;AAElB,0BAAsB,UAAU,SAAS;AACzC,aAAS,KAAK,MAAM,WAAW;AAC/B,UAAM,YAAY,CAAC,MAAqB,iBAAiB,QAAQ,CAAC;AAClE,aAAS,iBAAiB,WAAW,SAAS;AAM9C,UAAM,aAAa,WAAW,MAAM;;AAClC,WAAI,eAAU,YAAV,mBAAmB,SAAS,SAAS,eAAgB;AACzD,YAAM,aAAY,eAAU,YAAV,mBAAmB;AAAA,QACnC;AAAA;AAEF,6CAAW;AAAA,IACb,GAAG,CAAC;AAEJ,WAAO,MAAM;;AACX,mBAAa,UAAU;AACvB,eAAS,KAAK,MAAM,WAAW;AAC/B,eAAS,oBAAoB,WAAW,SAAS;AACjD,kCAAsB,YAAtB,mBAA+B;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,IAAI,CAAC;AAET,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,OAAO,aAAa,YAAa,QAAO;AAE5C,SAAO,aACL;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,WAAW,0BAA0B,SAAS;AAAA,MACzD,SAAS,uBAAuB,UAAU;AAAA,MAC1C,OAAO;AAAA,QACL,UAAU;AAAA,QACV,OAAO;AAAA,QACP,iBAAiB,qBAAqB,GAAG,OAAO,OAAO,WAAW,IAAI,OAAO,GAAG,OAAO,OAAO,WAAW,IAAI;AAAA,QAC7G,gBAAgB,qBAAqB,cAAc;AAAA,QACnD,sBAAsB,qBAAqB,cAAc;AAAA,QACzD,SAAS;AAAA,QACT,YAAY,SAAS,eAAe,YAAY;AAAA,QAChD,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,WAAW,0BAA0B,OAAO,UAAU,SAAS,MAAM,MAAM,OAAO,UAAU,OAAO,OAAO;AAAA,MAAA;AAAA,MAG5G,UAAA;AAAA,QAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAK;AAAA,YACL,MAAK;AAAA,YACL,cAAW;AAAA,YACX,mBAAiB,QAAQ,UAAU;AAAA,YACnC,WAAU;AAAA,YACV,SAAS,CAAC,MAAM,EAAE,gBAAA;AAAA,YAClB,OAAO;AAAA,cACL,OAAO,OAAO;AAAA,cACd,UAAU,SAAS,eAAe,UAAU;AAAA,cAC5C,WAAW,OAAO;AAAA,cAClB,iBAAiB,qBAAqB,6BAA6B,OAAO,OAAO,WAAW;AAAA,cAC5F,GAAI,sBAAsB,EAAE,gBAAgB,cAAc,sBAAsB,cAAc,QAAQ,oCAAA;AAAA,cACtG,cAAc,SAAS,eAAe,IAAI,OAAO,aAAa;AAAA,cAC9D,WAAW,OAAO,QAAQ;AAAA,cAC1B,SAAS;AAAA,cACT,eAAe;AAAA,cACf,UAAU;AAAA,cACV,WAAW,uBAAuB,OAAO,UAAU,SAAS,MAAM,MAAM,OAAO,UAAU,OAAO,OAAO;AAAA,YAAA;AAAA,YAIvG,UAAA;AAAA,eAAA,SAAS,oBACT;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,OAAO;AAAA,oBACL,SAAS;AAAA,oBACT,YAAY;AAAA,oBACZ,gBAAgB;AAAA,oBAChB,SAAS,GAAG,OAAO,QAAQ,EAAE,IAAI,OAAO,QAAQ,EAAE;AAAA,oBAClD,cAAc,OAAO,QAAQ;AAAA,kBAAA;AAAA,kBAG9B,UAAA;AAAA,oBAAA,SACC;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,IAAI;AAAA,wBACJ,OAAO;AAAA,0BACL,QAAQ;AAAA,0BACR,UAAU,OAAO,WAAW,SAAS;AAAA,0BACrC,YAAY,OAAO,WAAW,WAAW;AAAA,0BACzC,OAAO,OAAO,OAAO,KAAK;AAAA,wBAAA;AAAA,wBAG3B,UAAA;AAAA,sBAAA;AAAA,oBAAA;AAAA,oBAGJ,mBACC;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,MAAK;AAAA,wBACL,SAAS;AAAA,wBACT,cAAW;AAAA,wBACX,OAAO;AAAA,0BACL,SAAS,OAAO,QAAQ;AAAA,0BACxB,UAAU;AAAA,0BACV,WAAW;AAAA,0BACX,iBAAiB;AAAA,0BACjB,QAAQ;AAAA,0BACR,cAAc,OAAO,aAAa;AAAA,0BAClC,QAAQ;AAAA,0BACR,OAAO,OAAO,OAAO,KAAK,SAAS,OAAO,OAAO,KAAK;AAAA,0BACtD,SAAS;AAAA,0BACT,YAAY;AAAA,0BACZ,gBAAgB;AAAA,0BAChB,YAAY,SAAS,OAAO,UAAU,IAAI;AAAA,wBAAA;AAAA,wBAE5C,cAAc,CAAC,MAAM;AACnB,4BAAE,cAAc,MAAM,QAAQ,OAAO,OAAO,KAAK;AAAA,wBACnD;AAAA,wBACA,cAAc,CAAC,MAAM;AACnB,4BAAE,cAAc,MAAM,QAAQ,OAAO,OAAO,KAAK,SAAS,OAAO,OAAO,KAAK;AAAA,wBAC/E;AAAA,wBAEA,UAAA,oBAAC,OAAA,EAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,gBACnD,UAAA,oBAAC,QAAA,EAAK,GAAE,yGAAwG,EAAA,CAClH;AAAA,sBAAA;AAAA,oBAAA;AAAA,kBACF;AAAA,gBAAA;AAAA,cAAA;AAAA,cAMN;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,OAAO;AAAA,oBACL,MAAM;AAAA,oBACN,SAAS,OAAO,QAAQ;AAAA,oBACxB,UAAU;AAAA,kBAAA;AAAA,kBAGX;AAAA,gBAAA;AAAA,cAAA;AAAA,YACH;AAAA,UAAA;AAAA,QAAA;AAAA,4BAGD,SAAA,EACE,UAAA;AAAA;AAAA;AAAA,UAAA,CAIH;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA,GAED,SAAS,IAAI;AAClB,CAAC;AAKA,OAAe,UAAU;"}
@@ -1,8 +1,8 @@
1
1
  import { jsxs, jsx } from "react/jsx-runtime";
2
2
  import { memo, useState, useRef, useCallback, useContext, createContext, useEffect } from "react";
3
+ import { useTheme } from "../../theme/ThemeProvider.js";
3
4
  import { safeAccentText } from "../../utils/index.js";
4
5
  import { useBreakpoint } from "../layout/useBreakpoint.js";
5
- import { useTheme } from "../../theme/ThemeProvider.js";
6
6
  const ToastContext = createContext(null);
7
7
  function useToast() {
8
8
  const ctx = useContext(ToastContext);
@@ -83,6 +83,10 @@ export { DataTable, DataTableRowDetail } from './data/DataTable';
83
83
  export type { DataTableProps, DataTableColumn, DataTableRowDetailProps, DataTableRowDetailField } from './data/DataTable';
84
84
  export { ImageGallery } from './widgets/ImageGallery';
85
85
  export type { ImageGalleryProps, GalleryImage } from './widgets/ImageGallery';
86
+ export { ImageFrame, decodeImage } from './widgets/ImageFrame';
87
+ export type { ImageFrameProps, ImageColormap } from './widgets/ImageFrame';
88
+ export { ImagePanel } from './widgets/ImagePanel';
89
+ export type { ImagePanelProps } from './widgets/ImagePanel';
86
90
  export { ChatPanel, parseChatResponse, createChatResponseParser, parseMcpToolResult, CHAT_RESPONSE_TOOL_SCHEMA, CHAT_RESPONSE_MCP_TOOL, CHAT_RESPONSE_JSON_PROMPT, CHAT_RESPONSE_YAML_PROMPT, CHAT_STATUS_RULES_PROMPT } from './widgets/ChatPanel';
87
91
  export type { ChatPanelProps, ChatMessage, ChatBlock, ChatBlockEvent, ChatBlockAlert, ChatBlockTelemetry, ChatBlockProgress, ChatBlockTable, ChatBlockActions, ChatBlockChoice, ChatBlockConfirm, ChatBlockCommand, ChatBlockKV, ChatResponseFormat, ChatResponsePayload, ChatResponseParserOptions, McpToolContent, McpToolResult } from './widgets/ChatPanel';
88
92
  export { ConnectionForm } from './widgets/ConnectionForm';
@@ -0,0 +1,166 @@
1
+ import { Icon, getIconNames, isValidIconName } from "./display/Icon.js";
2
+ import { Button } from "./inputs/Button.js";
3
+ import { Input } from "./inputs/Input.js";
4
+ import { Select } from "./inputs/Select.js";
5
+ import { Toggle } from "./inputs/Toggle.js";
6
+ import { Checkbox } from "./inputs/Checkbox.js";
7
+ import { Tooltip } from "./overlays/Tooltip.js";
8
+ import { Dialog } from "./feedback/Dialog.js";
9
+ import { Badge } from "./display/Badge.js";
10
+ import { Tabs } from "./navigation/Tabs.js";
11
+ import { Container } from "./display/Container.js";
12
+ import { GLASS_COLOR_OVERLAYS, GlassCard } from "./display/GlassCard.js";
13
+ import { Pagination } from "./navigation/Pagination.js";
14
+ import { DataValue, DataValueGroup } from "./data/DataValue.js";
15
+ import { HeaderIconWithStatus } from "./display/HeaderIconWithStatus.js";
16
+ import { CardHeader } from "./display/CardHeader.js";
17
+ import { CATEGORY_ICONS, CATEGORY_LABELS, PROPERTY_PRESETS, createPropertyConfig, deriveBatteryStatus, deriveStatus, formatPropertyLabel, formatPropertyValue, getPropertiesByCategory, getPropertyConfig } from "./data/propertyConfig.js";
18
+ import { MessageStream } from "./widgets/MessageStream.js";
19
+ import { AppBar } from "./navigation/AppBar.js";
20
+ import { ColorPickerPanel } from "./widgets/ColorPickerPanel.js";
21
+ import { Body1, Body2, Body3, Compact, DataText, Display1, Display2, FONT_FAMILY_MONO, FONT_FAMILY_PRIMARY, FONT_WEIGHTS, H1, H2, H3, H4, H5, H6, Label, Micro, Mono, Typography } from "./display/Typography.js";
22
+ import { NumberInput } from "./inputs/NumberInput.js";
23
+ import { SIDENAV_HEADER_LOGO_SLOT_HEIGHT_PX, SideNav } from "./navigation/SideNav.js";
24
+ import { ToastProvider, useToast, useToastManager } from "./feedback/Toast.js";
25
+ import { Menu, Popover } from "./overlays/Popover.js";
26
+ import { Box } from "./layout/Box.js";
27
+ import { Flex } from "./layout/Flex.js";
28
+ import { Grid } from "./layout/Grid.js";
29
+ import { HStack, Stack, VStack } from "./layout/Stack.js";
30
+ import { Center } from "./layout/Center.js";
31
+ import { Spacer } from "./layout/Spacer.js";
32
+ import { Divider } from "./layout/Divider.js";
33
+ import { BREAKPOINTS, useBreakpoint } from "./layout/useBreakpoint.js";
34
+ import { resolveResponsive, resolveSpacing } from "./layout/responsive.js";
35
+ import { ConfirmDialog, ConfirmProvider, useConfirm } from "./feedback/ConfirmDialog.js";
36
+ import { PinInput } from "./inputs/PinInput.js";
37
+ import { CopyButton, useCopyToClipboard } from "./display/CopyButton.js";
38
+ import { DataTable, DataTableRowDetail } from "./data/DataTable.js";
39
+ import { ImageGallery } from "./widgets/ImageGallery.js";
40
+ import { ImageFrame, decodeImage } from "./widgets/ImageFrame.js";
41
+ import { ImagePanel } from "./widgets/ImagePanel.js";
42
+ import { CHAT_RESPONSE_JSON_PROMPT, CHAT_RESPONSE_MCP_TOOL, CHAT_RESPONSE_TOOL_SCHEMA, CHAT_RESPONSE_YAML_PROMPT, CHAT_STATUS_RULES_PROMPT, ChatPanel, createChatResponseParser, parseChatResponse, parseMcpToolResult } from "./widgets/ChatPanel.js";
43
+ import { ConnectionForm } from "./widgets/ConnectionForm.js";
44
+ import { SidePanel } from "./overlays/SidePanel.js";
45
+ import { HexViewer, REGION_BORDER_COLORS, REGION_COLORS } from "./widgets/HexViewer.js";
46
+ import { LimitsBar } from "./inputs/LimitsBar.js";
47
+ import { LogViewer } from "./widgets/LogViewer.js";
48
+ import { PacketViewer } from "./widgets/PacketViewer.js";
49
+ import { CommandBuilder } from "./widgets/CommandBuilder.js";
50
+ import { FileExplorer } from "./widgets/FileExplorer.js";
51
+ import { MissionCalendar } from "./widgets/MissionCalendar.js";
52
+ import { ActivityPlanner } from "./widgets/ActivityPlanner.js";
53
+ import { Capture, loadCapturePlaceholderImage, useCapture } from "./widgets/Capture.js";
54
+ export {
55
+ ActivityPlanner,
56
+ AppBar,
57
+ BREAKPOINTS,
58
+ Badge,
59
+ Body1,
60
+ Body2,
61
+ Body3,
62
+ Box,
63
+ Button,
64
+ CATEGORY_ICONS,
65
+ CATEGORY_LABELS,
66
+ CHAT_RESPONSE_JSON_PROMPT,
67
+ CHAT_RESPONSE_MCP_TOOL,
68
+ CHAT_RESPONSE_TOOL_SCHEMA,
69
+ CHAT_RESPONSE_YAML_PROMPT,
70
+ CHAT_STATUS_RULES_PROMPT,
71
+ Capture,
72
+ CardHeader,
73
+ Center,
74
+ ChatPanel,
75
+ Checkbox,
76
+ ColorPickerPanel,
77
+ CommandBuilder,
78
+ Compact,
79
+ ConfirmDialog,
80
+ ConfirmProvider,
81
+ ConnectionForm,
82
+ Container,
83
+ CopyButton,
84
+ DataTable,
85
+ DataTableRowDetail,
86
+ DataText,
87
+ DataValue,
88
+ DataValueGroup,
89
+ Dialog,
90
+ Display1,
91
+ Display2,
92
+ Divider,
93
+ FONT_FAMILY_MONO,
94
+ FONT_FAMILY_PRIMARY,
95
+ FONT_WEIGHTS,
96
+ FileExplorer,
97
+ Flex,
98
+ GLASS_COLOR_OVERLAYS,
99
+ GlassCard,
100
+ Grid,
101
+ H1,
102
+ H2,
103
+ H3,
104
+ H4,
105
+ H5,
106
+ H6,
107
+ HStack,
108
+ HeaderIconWithStatus,
109
+ HexViewer,
110
+ Icon,
111
+ ImageFrame,
112
+ ImageGallery,
113
+ ImagePanel,
114
+ Input,
115
+ Label,
116
+ LimitsBar,
117
+ LogViewer,
118
+ Menu,
119
+ MessageStream,
120
+ Micro,
121
+ MissionCalendar,
122
+ Mono,
123
+ NumberInput,
124
+ PROPERTY_PRESETS,
125
+ PacketViewer,
126
+ Pagination,
127
+ PinInput,
128
+ Popover,
129
+ REGION_BORDER_COLORS,
130
+ REGION_COLORS,
131
+ SIDENAV_HEADER_LOGO_SLOT_HEIGHT_PX,
132
+ Select,
133
+ SideNav,
134
+ SidePanel,
135
+ Spacer,
136
+ Stack,
137
+ Tabs,
138
+ ToastProvider,
139
+ Toggle,
140
+ Tooltip,
141
+ Typography,
142
+ VStack,
143
+ createChatResponseParser,
144
+ createPropertyConfig,
145
+ decodeImage,
146
+ deriveBatteryStatus,
147
+ deriveStatus,
148
+ formatPropertyLabel,
149
+ formatPropertyValue,
150
+ getIconNames,
151
+ getPropertiesByCategory,
152
+ getPropertyConfig,
153
+ isValidIconName,
154
+ loadCapturePlaceholderImage,
155
+ parseChatResponse,
156
+ parseMcpToolResult,
157
+ resolveResponsive,
158
+ resolveSpacing,
159
+ useBreakpoint,
160
+ useCapture,
161
+ useConfirm,
162
+ useCopyToClipboard,
163
+ useToast,
164
+ useToastManager
165
+ };
166
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,8 +1,8 @@
1
1
  import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
2
  import { memo, forwardRef, useState, useMemo, useRef, useCallback, useLayoutEffect } from "react";
3
3
  import ReactDOM from "react-dom";
4
- import { safeAccentText, classNames } from "../../utils/index.js";
5
4
  import { useTheme } from "../../theme/ThemeProvider.js";
5
+ import { safeAccentText, classNames } from "../../utils/index.js";
6
6
  const Button = memo(forwardRef(function Button2({
7
7
  variant = "primary",
8
8
  size = "medium",
@@ -1,7 +1,7 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { memo, forwardRef, useState, useId } from "react";
3
- import { classNames } from "../../utils/index.js";
4
3
  import { useTheme } from "../../theme/ThemeProvider.js";
4
+ import { classNames } from "../../utils/index.js";
5
5
  const Checkbox = memo(forwardRef(function Checkbox2({
6
6
  type = "checkbox",
7
7
  checked = false,
@@ -1,8 +1,8 @@
1
1
  import { jsxs, Fragment, jsx } from "react/jsx-runtime";
2
2
  import { memo, forwardRef, useState, useId } from "react";
3
+ import { useTheme } from "../../theme/ThemeProvider.js";
3
4
  import { safeAccentText, classNames } from "../../utils/index.js";
4
5
  import { useBreakpoint } from "../layout/useBreakpoint.js";
5
- import { useTheme } from "../../theme/ThemeProvider.js";
6
6
  const Input = memo(forwardRef(function Input2({
7
7
  label,
8
8
  helperText,
@@ -1,8 +1,8 @@
1
1
  import { jsxs, jsx } from "react/jsx-runtime";
2
2
  import { memo, forwardRef, useState, useRef, useId, useMemo, useEffect, useCallback } from "react";
3
+ import { useTheme } from "../../theme/ThemeProvider.js";
3
4
  import { deriveStatus } from "../data/propertyConfig.js";
4
5
  import { StatusIndicator } from "../../astro/StatusIndicator.js";
5
- import { useTheme } from "../../theme/ThemeProvider.js";
6
6
  const DEFAULT_DECIMAL_PLACES = 0;
7
7
  const NumberInput = memo(forwardRef(function NumberInput2({
8
8
  value,
@@ -1,7 +1,7 @@
1
1
  import { jsxs, Fragment, jsx } from "react/jsx-runtime";
2
2
  import { memo, useRef, useState, useEffect, useCallback } from "react";
3
- import { useBreakpoint } from "../layout/useBreakpoint.js";
4
3
  import { useTheme } from "../../theme/ThemeProvider.js";
4
+ import { useBreakpoint } from "../layout/useBreakpoint.js";
5
5
  const PinInput = memo(function PinInput2({
6
6
  length = 6,
7
7
  type = "alphanumeric",
@@ -1,9 +1,9 @@
1
1
  import { jsxs, Fragment, jsx } from "react/jsx-runtime";
2
2
  import { memo, forwardRef, useState, useRef, useId, useLayoutEffect, useEffect } from "react";
3
3
  import { createPortal } from "react-dom";
4
+ import { useTheme } from "../../theme/ThemeProvider.js";
4
5
  import { classNames } from "../../utils/index.js";
5
6
  import { useBreakpoint } from "../layout/useBreakpoint.js";
6
- import { useTheme } from "../../theme/ThemeProvider.js";
7
7
  const Select = memo(forwardRef(function Select2({
8
8
  label,
9
9
  options,
@@ -1,7 +1,7 @@
1
1
  import { jsxs, jsx } from "react/jsx-runtime";
2
2
  import { memo, forwardRef, useState, useId } from "react";
3
- import { classNames } from "../../utils/index.js";
4
3
  import { useTheme } from "../../theme/ThemeProvider.js";
4
+ import { classNames } from "../../utils/index.js";
5
5
  const Toggle = memo(forwardRef(function Toggle2({
6
6
  checked = false,
7
7
  onChange,
@@ -1,8 +1,8 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
2
  import { memo, forwardRef } from "react";
3
+ import { useTheme } from "../../theme/ThemeProvider.js";
3
4
  import { useBreakpoint } from "./useBreakpoint.js";
4
5
  import { resolveResponsive, resolveResponsiveSpacing } from "./responsive.js";
5
- import { useTheme } from "../../theme/ThemeProvider.js";
6
6
  const Box = memo(forwardRef(function Box2({
7
7
  as: Component = "div",
8
8
  padding,
@@ -1,8 +1,8 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
2
  import { memo, forwardRef } from "react";
3
+ import { useTheme } from "../../theme/ThemeProvider.js";
3
4
  import { useBreakpoint } from "./useBreakpoint.js";
4
5
  import { resolveResponsive, resolveResponsiveSpacing } from "./responsive.js";
5
- import { useTheme } from "../../theme/ThemeProvider.js";
6
6
  const Flex = memo(forwardRef(function Flex2({
7
7
  direction,
8
8
  wrap,
@@ -1,8 +1,8 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
2
  import { memo, forwardRef } from "react";
3
+ import { useTheme } from "../../theme/ThemeProvider.js";
3
4
  import { useBreakpoint } from "./useBreakpoint.js";
4
5
  import { resolveResponsive, resolveResponsiveSpacing } from "./responsive.js";
5
- import { useTheme } from "../../theme/ThemeProvider.js";
6
6
  const Grid = memo(forwardRef(function Grid2({
7
7
  columns,
8
8
  autoFit,
@@ -1,8 +1,8 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import React, { memo, forwardRef } from "react";
3
+ import { useTheme } from "../../theme/ThemeProvider.js";
3
4
  import { useBreakpoint } from "./useBreakpoint.js";
4
5
  import { resolveResponsiveSpacing } from "./responsive.js";
5
- import { useTheme } from "../../theme/ThemeProvider.js";
6
6
  const Stack = memo(forwardRef(function Stack2({
7
7
  as: Component = "div",
8
8
  direction = "column",
@@ -1,12 +1,12 @@
1
1
  import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
2
  import React, { memo, useState, useRef, useEffect, useMemo } from "react";
3
+ import { useTheme } from "../../theme/ThemeProvider.js";
3
4
  import { useDisplaySettingsOptional } from "../../context/DisplaySettingsContext.js";
4
5
  import { classNames, safeAccentText } from "../../utils/index.js";
5
6
  import { AstroIcon } from "../display/AstroIcon.js";
6
7
  import { ColorPickerPanel } from "../widgets/ColorPickerPanel.js";
7
8
  import { Tooltip } from "../overlays/Tooltip.js";
8
9
  import { useBreakpoint } from "../layout/useBreakpoint.js";
9
- import { useTheme } from "../../theme/ThemeProvider.js";
10
10
  const THEME_VARIANTS = [
11
11
  { key: "hybrid", label: "Zen (Hybrid)", tooltip: "Default theme - Astro status colors with purple accents" },
12
12
  { key: "purple-hue", label: "Zen (Purple Hue)", tooltip: "Purple accent theme - vibrant purple tones" },
@@ -1,7 +1,7 @@
1
1
  import { jsxs, jsx } from "react/jsx-runtime";
2
2
  import { memo, useMemo } from "react";
3
- import { classNames } from "../../utils/index.js";
4
3
  import { useTheme } from "../../theme/ThemeProvider.js";
4
+ import { classNames } from "../../utils/index.js";
5
5
  const Pagination = memo(function Pagination2({
6
6
  currentPage,
7
7
  totalPages,
@@ -1,8 +1,8 @@
1
1
  import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
2
  import { memo, useState, useEffect, useCallback, useContext, useLayoutEffect, createContext } from "react";
3
+ import { useTheme } from "../../theme/ThemeProvider.js";
3
4
  import { safeAccentText } from "../../utils/index.js";
4
5
  import { Icon } from "../display/Icon.js";
5
- import { useTheme } from "../../theme/ThemeProvider.js";
6
6
  const useIsomorphicLayoutEffect = typeof window !== "undefined" ? useLayoutEffect : useEffect;
7
7
  const SIDENAV_STATUS_COLORS = {
8
8
  off: "#a4abb6",