uibee 2.14.0 → 2.16.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.
@@ -1,7 +1,7 @@
1
1
  import { useState } from 'react'
2
- import ReactMarkdown from 'react-markdown'
3
2
  import { Eye, Pencil } from 'lucide-react'
4
3
  import { FieldWrapper } from './shared'
4
+ import MarkdownRender from '@components/markdownrender/markdownRender'
5
5
 
6
6
  export type TextareaProps = Omit<React.ComponentProps<'textarea'>, 'name'> & {
7
7
  name: string
@@ -31,6 +31,8 @@ export default function Textarea(props: TextareaProps) {
31
31
  const jsonError = type === 'json' && value ? isValidJson(value as string) : undefined
32
32
  const displayError = jsonError || error
33
33
 
34
+ console.log(value)
35
+
34
36
  return (
35
37
  <FieldWrapper
36
38
  label={label}
@@ -60,14 +62,10 @@ export default function Textarea(props: TextareaProps) {
60
62
  <div
61
63
  className={`
62
64
  w-full rounded-md bg-login-500/50 border border-login-500
63
- text-login-text
64
- p-3
65
- prose prose-invert prose-base max-w-none overflow-y-auto
66
- ${error ? 'border-red-500' : ''}
65
+ p-3 overflow-y-auto ${error ? 'border-red-500' : ''}
67
66
  `}
68
- style={{ minHeight: `${rows * 1.5}rem` }}
69
67
  >
70
- <ReactMarkdown>{String(value || '')}</ReactMarkdown>
68
+ <MarkdownRender MDstr={String(value || '')} />
71
69
  </div>
72
70
  )}
73
71
 
@@ -0,0 +1,62 @@
1
+ type ToggleOption<T> = {
2
+ value: T
3
+ label?: string
4
+ text?: string
5
+ icon?: React.ReactNode
6
+ }
7
+
8
+ type ToggleProps<T> = {
9
+ value: T
10
+ onChange: (value: T) => void
11
+ left: ToggleOption<T>
12
+ right: ToggleOption<T>
13
+ }
14
+
15
+ export default function Toggle<T>({
16
+ value,
17
+ onChange,
18
+ left,
19
+ right,
20
+ }: ToggleProps<T>) {
21
+ const active = 'bg-login-200 text-login-950 shadow'
22
+ const idle = 'text-login-200 hover:bg-login-50/10 hover:text-login-50'
23
+
24
+ const base =
25
+ 'flex items-center justify-center rounded-full transition gap-1'
26
+
27
+ function renderContent(opt: ToggleOption<T>) {
28
+ return (
29
+ <>
30
+ {opt.icon}
31
+ {opt.text && <span>{opt.text}</span>}
32
+ </>
33
+ )
34
+ }
35
+
36
+ const isLeftActive = value === left.value
37
+ const isRightActive = value === right.value
38
+
39
+ return (
40
+ <div className='flex items-center rounded-full border border-login-100/10 bg-login-50/5 p-1'>
41
+ <button
42
+ type='button'
43
+ onClick={() => onChange(left.value)}
44
+ aria-label={left.label ?? left.text}
45
+ aria-pressed={isLeftActive}
46
+ className={`${base} px-2 h-7 ${isLeftActive ? active : idle}`}
47
+ >
48
+ {renderContent(left)}
49
+ </button>
50
+
51
+ <button
52
+ type='button'
53
+ onClick={() => onChange(right.value)}
54
+ aria-label={right.label ?? right.text}
55
+ aria-pressed={isRightActive}
56
+ className={`${base} px-2 h-7 ${isRightActive ? active : idle}`}
57
+ >
58
+ {renderContent(right)}
59
+ </button>
60
+ </div>
61
+ )
62
+ }
@@ -0,0 +1,17 @@
1
+ import Markdown from 'react-markdown'
2
+ import remarkGfm from 'remark-gfm'
3
+
4
+ export default function MarkdownRender({MDstr}: {MDstr: string}) {
5
+ return (
6
+ <div className='prose prose-sm prose-custom max-w-none'>
7
+ <Markdown
8
+ components={{ h1: ({...props}) => <h2 {...props} /> }}
9
+ remarkPlugins={
10
+ [remarkGfm]
11
+ }
12
+ >
13
+ {MDstr.replace(/\\n/g, '\n')}
14
+ </Markdown>
15
+ </div>
16
+ )
17
+ }
@@ -0,0 +1,17 @@
1
+ type SeverityLevel = 'critical' | 'high' | 'medium' | 'low' | 'unknown'
2
+
3
+ export const severityLabel: Record<SeverityLevel, string> = {
4
+ critical: 'Critical',
5
+ high: 'High',
6
+ medium: 'Medium',
7
+ low: 'Low',
8
+ unknown: 'Unknown',
9
+ }
10
+
11
+ export const severityClasses: Record<SeverityLevel, string> = {
12
+ critical: 'border-red-400/25 bg-red-500/10 text-red-200',
13
+ high: 'border-orange-400/25 bg-orange-500/10 text-orange-200',
14
+ medium: 'border-amber-400/25 bg-amber-500/10 text-amber-200',
15
+ low: 'border-sky-400/25 bg-sky-500/10 text-sky-200',
16
+ unknown: 'border-login-100/10 bg-login-50/5 text-login-200',
17
+ }
@@ -0,0 +1,22 @@
1
+ import { severityClasses, severityLabel } from './constants'
2
+
3
+ type SeverityLevel = 'critical' | 'high' | 'medium' | 'low' | 'unknown'
4
+
5
+ type SeverityPillProps = {
6
+ severity: SeverityLevel
7
+ count: number
8
+ compact?: boolean
9
+ }
10
+
11
+ export default function SeverityPill({ severity, count, compact = false }: SeverityPillProps) {
12
+ if (count === 0) {
13
+ return null
14
+ }
15
+
16
+ return (
17
+ <div className={`rounded-xl border ${compact ? 'px-3 py-2' : 'p-3'} ${severityClasses[severity]}`}>
18
+ <div className='text-[11px] font-medium uppercase tracking-[0.18em]'>{severityLabel[severity]}</div>
19
+ <div className={`${compact ? 'mt-1 text-sm' : 'mt-2 text-lg'} font-semibold`}>{count}</div>
20
+ </div>
21
+ )
22
+ }
package/src/globals.css CHANGED
@@ -33,6 +33,7 @@
33
33
  --color-login-300: #5e5e5e;
34
34
  --color-login-200: #727272;
35
35
  --color-login-100: #b0b0b0;
36
+ --color-login-75: #e4e4e4;
36
37
  --color-login-50: #ededed;
37
38
 
38
39
  --color-login-text: #ededed;
@@ -98,6 +99,25 @@
98
99
  --color-login-text: #0e0e0e;
99
100
  }
100
101
 
102
+ @utility prose-custom {
103
+ --tw-prose-body: var(--color-login-text);
104
+ --tw-prose-headings: var(--color-login-text);
105
+ --tw-prose-lead: var(--color-login-300);
106
+ --tw-prose-links: var(--color-login);
107
+ --tw-prose-bold: var(--color-login-text);
108
+ --tw-prose-counters: var(--color-login-400);
109
+ --tw-prose-bullets: var(--color-login-400);
110
+ --tw-prose-hr: var(--color-login-300);
111
+ --tw-prose-quotes: var(--color-login-text);
112
+ --tw-prose-quote-borders: var(--color-login-300);
113
+ --tw-prose-captions: var(--color-login-300);
114
+ --tw-prose-code: var(--color-login-text);
115
+ --tw-prose-pre-code: var(--color-login-text);
116
+ --tw-prose-pre-bg: var(--color-login-800);
117
+ --tw-prose-th-borders: var(--color-login-500);
118
+ --tw-prose-td-borders: var(--color-login-500);
119
+ }
120
+
101
121
  @keyframes jump {
102
122
  40% {
103
123
  transform: translateY(-0.3rem);
package/tsconfig.json CHANGED
@@ -8,6 +8,7 @@
8
8
  "rootDir": ".",
9
9
  "esModuleInterop": true,
10
10
  "forceConsistentCasingInFileNames": true,
11
+ "noUncheckedSideEffectImports": false,
11
12
  "strict": true,
12
13
  "skipLibCheck": true,
13
14
  "jsx": "react-jsx",