Compare commits
6 Commits
9814010a17
...
1d0787718b
Author | SHA1 | Date | |
---|---|---|---|
![]() |
1d0787718b | ||
![]() |
467e8be310 | ||
![]() |
791c5a841c | ||
![]() |
92f495f5b8 | ||
![]() |
0d11ddb68f | ||
![]() |
26265707a6 |
|
@ -154,7 +154,7 @@ This is the build for local Development
|
||||||
|
|
||||||
- Install Python 3.12, NodeJS, VSCode, Docker Desktop
|
- Install Python 3.12, NodeJS, VSCode, Docker Desktop
|
||||||
- copy import wheels from ConceptCore to rsconcept/backend/import
|
- copy import wheels from ConceptCore to rsconcept/backend/import
|
||||||
- run rsconcept/backend/LocalEnvSetup.ps1
|
- run scripts/dev/LocalEnvSetup.ps1
|
||||||
- use VSCode configs in root folder to start development
|
- use VSCode configs in root folder to start development
|
||||||
- use 'npm run prepare' to regenerate frontend parsers (if you change grammar files)
|
- use 'npm run prepare' to regenerate frontend parsers (if you change grammar files)
|
||||||
|
|
||||||
|
|
3
TODO.txt
3
TODO.txt
|
@ -1,6 +1,9 @@
|
||||||
!! This is not complete list of TODOs !!
|
!! This is not complete list of TODOs !!
|
||||||
For more specific TODOs see comments in code
|
For more specific TODOs see comments in code
|
||||||
|
|
||||||
|
[Bugs - PENDING]
|
||||||
|
- Tab index still selecting background elements when modal is active
|
||||||
|
|
||||||
[Functionality - PROGRESS]
|
[Functionality - PROGRESS]
|
||||||
- OSS change propagation: Advanced features
|
- OSS change propagation: Advanced features
|
||||||
|
|
||||||
|
|
|
@ -640,8 +640,6 @@ def inline_synthesis(request: Request) -> HttpResponse:
|
||||||
PropagationFacade.before_substitute(receiver, substitutions)
|
PropagationFacade.before_substitute(receiver, substitutions)
|
||||||
receiver.substitute(substitutions)
|
receiver.substitute(substitutions)
|
||||||
|
|
||||||
receiver.restore_order()
|
|
||||||
|
|
||||||
return Response(
|
return Response(
|
||||||
status=c.HTTP_200_OK,
|
status=c.HTTP_200_OK,
|
||||||
data=s.RSFormParseSerializer(receiver.model).data
|
data=s.RSFormParseSerializer(receiver.model).data
|
||||||
|
|
998
rsconcept/frontend/package-lock.json
generated
998
rsconcept/frontend/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
|
@ -14,8 +14,8 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@lezer/lr": "^1.4.2",
|
"@lezer/lr": "^1.4.2",
|
||||||
"@tanstack/react-table": "^8.20.5",
|
"@tanstack/react-table": "^8.20.5",
|
||||||
"@uiw/codemirror-themes": "^4.23.3",
|
"@uiw/codemirror-themes": "^4.23.5",
|
||||||
"@uiw/react-codemirror": "^4.23.3",
|
"@uiw/react-codemirror": "^4.23.5",
|
||||||
"axios": "^1.7.7",
|
"axios": "^1.7.7",
|
||||||
"clsx": "^2.1.1",
|
"clsx": "^2.1.1",
|
||||||
"framer-motion": "^11.5.6",
|
"framer-motion": "^11.5.6",
|
||||||
|
@ -25,39 +25,39 @@
|
||||||
"react-dom": "^18.3.1",
|
"react-dom": "^18.3.1",
|
||||||
"react-error-boundary": "^4.0.13",
|
"react-error-boundary": "^4.0.13",
|
||||||
"react-icons": "^5.3.0",
|
"react-icons": "^5.3.0",
|
||||||
"react-intl": "^6.7.0",
|
"react-intl": "^6.8.0",
|
||||||
"react-loader-spinner": "^6.1.6",
|
"react-loader-spinner": "^6.1.6",
|
||||||
"react-router-dom": "^6.26.2",
|
"react-router-dom": "^6.27.0",
|
||||||
"react-select": "^5.8.1",
|
"react-select": "^5.8.1",
|
||||||
"react-tabs": "^6.0.2",
|
"react-tabs": "^6.0.2",
|
||||||
"react-toastify": "^10.0.5",
|
"react-toastify": "^10.0.6",
|
||||||
"react-tooltip": "^5.28.0",
|
"react-tooltip": "^5.28.0",
|
||||||
"react-zoom-pan-pinch": "^3.6.1",
|
"react-zoom-pan-pinch": "^3.6.1",
|
||||||
"reactflow": "^11.11.4",
|
"reactflow": "^11.11.4",
|
||||||
"reagraph": "^4.19.3",
|
"reagraph": "^4.19.3",
|
||||||
"use-debounce": "^10.0.3"
|
"use-debounce": "^10.0.4"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@lezer/generator": "^1.7.1",
|
"@lezer/generator": "^1.7.1",
|
||||||
"@types/jest": "^29.5.13",
|
"@types/jest": "^29.5.13",
|
||||||
"@types/node": "^22.5.5",
|
"@types/node": "^22.7.5",
|
||||||
"@types/react": "^18.3.8",
|
"@types/react": "^18.3.11",
|
||||||
"@types/react-dom": "^18.3.0",
|
"@types/react-dom": "^18.3.1",
|
||||||
"@typescript-eslint/eslint-plugin": "^8.0.1",
|
"@typescript-eslint/eslint-plugin": "^8.0.1",
|
||||||
"@typescript-eslint/parser": "^8.0.1",
|
"@typescript-eslint/parser": "^8.0.1",
|
||||||
"@vitejs/plugin-react": "^4.3.1",
|
"@vitejs/plugin-react": "^4.3.2",
|
||||||
"autoprefixer": "^10.4.20",
|
"autoprefixer": "^10.4.20",
|
||||||
"eslint": "^9.11.0",
|
"eslint": "^9.12.0",
|
||||||
"eslint-plugin-react": "^7.36.1",
|
"eslint-plugin-react": "^7.37.1",
|
||||||
"eslint-plugin-simple-import-sort": "^12.1.1",
|
"eslint-plugin-simple-import-sort": "^12.1.1",
|
||||||
"globals": "^15.9.0",
|
"globals": "^15.11.0",
|
||||||
"jest": "^29.7.0",
|
"jest": "^29.7.0",
|
||||||
"postcss": "^8.4.47",
|
"postcss": "^8.4.47",
|
||||||
"tailwindcss": "^3.4.12",
|
"tailwindcss": "^3.4.13",
|
||||||
"ts-jest": "^29.2.5",
|
"ts-jest": "^29.2.5",
|
||||||
"typescript": "^5.6.2",
|
"typescript": "^5.6.3",
|
||||||
"typescript-eslint": "^8.6.0",
|
"typescript-eslint": "^8.8.1",
|
||||||
"vite": "^5.4.7"
|
"vite": "^5.4.8"
|
||||||
},
|
},
|
||||||
"jest": {
|
"jest": {
|
||||||
"preset": "ts-jest",
|
"preset": "ts-jest",
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
@precedence { word, space }
|
@precedence { word, space }
|
||||||
}
|
}
|
||||||
|
|
||||||
textItem {
|
textItem {
|
||||||
!p1 ref |
|
!p1 ref |
|
||||||
!p2 Error |
|
!p2 Error |
|
||||||
!p3 Filler
|
!p3 Filler
|
||||||
|
|
|
@ -138,9 +138,19 @@ function DataTable<TData extends RowData>({
|
||||||
}
|
}
|
||||||
}, [rows, dense, noHeader, contentHeight]);
|
}, [rows, dense, noHeader, contentHeight]);
|
||||||
|
|
||||||
|
const columnSizeVars = useMemo(() => {
|
||||||
|
const headers = tableImpl.getFlatHeaders();
|
||||||
|
const colSizes: Record<string, number> = {};
|
||||||
|
for (const header of headers) {
|
||||||
|
colSizes[`--header-${header.id}-size`] = header.getSize();
|
||||||
|
colSizes[`--col-${header.column.id}-size`] = header.column.getSize();
|
||||||
|
}
|
||||||
|
return colSizes;
|
||||||
|
}, [tableImpl.getState().columnSizingInfo, tableImpl.getState().columnSizing]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div tabIndex={-1} id={id} className={className} style={{ minHeight: fixedSize, maxHeight: fixedSize, ...style }}>
|
<div tabIndex={-1} id={id} className={className} style={{ minHeight: fixedSize, maxHeight: fixedSize, ...style }}>
|
||||||
<table className='w-full'>
|
<table className='w-full' style={{ ...columnSizeVars }}>
|
||||||
{!noHeader ? (
|
{!noHeader ? (
|
||||||
<TableHeader
|
<TableHeader
|
||||||
table={tableImpl}
|
table={tableImpl}
|
||||||
|
|
|
@ -93,7 +93,8 @@ function TableBody<TData>({
|
||||||
style={{
|
style={{
|
||||||
cursor: onRowClicked || onRowDoubleClicked ? 'pointer' : 'auto',
|
cursor: onRowClicked || onRowDoubleClicked ? 'pointer' : 'auto',
|
||||||
paddingBottom: dense ? '0.25rem' : '0.5rem',
|
paddingBottom: dense ? '0.25rem' : '0.5rem',
|
||||||
paddingTop: dense ? '0.25rem' : '0.5rem'
|
paddingTop: dense ? '0.25rem' : '0.5rem',
|
||||||
|
width: noHeader && index === 0 ? `calc(var(--col-${cell.column.id}-size) * 1px)` : 'auto'
|
||||||
}}
|
}}
|
||||||
onClick={event => handleRowClicked(row, event)}
|
onClick={event => handleRowClicked(row, event)}
|
||||||
onDoubleClick={event => (onRowDoubleClicked ? onRowDoubleClicked(row.original, event) : undefined)}
|
onDoubleClick={event => (onRowDoubleClicked ? onRowDoubleClicked(row.original, event) : undefined)}
|
||||||
|
|
|
@ -41,7 +41,7 @@ function TableHeader<TData>({
|
||||||
style={{
|
style={{
|
||||||
paddingRight: enableSorting && header.column.getCanSort() ? '0px' : '2px',
|
paddingRight: enableSorting && header.column.getCanSort() ? '0px' : '2px',
|
||||||
textAlign: 'start',
|
textAlign: 'start',
|
||||||
width: header.getSize(),
|
width: `calc(var(--header-${header?.id}-size) * 1px)`,
|
||||||
cursor: enableSorting && header.column.getCanSort() ? 'pointer' : 'auto'
|
cursor: enableSorting && header.column.getCanSort() ? 'pointer' : 'auto'
|
||||||
}}
|
}}
|
||||||
onClick={enableSorting ? header.column.getToggleSortingHandler() : undefined}
|
onClick={enableSorting ? header.column.getToggleSortingHandler() : undefined}
|
||||||
|
|
|
@ -35,7 +35,7 @@ function ManualsPage() {
|
||||||
);
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='flex mx-auto max-w-[80rem]' style={{ minHeight: mainHeight }}>
|
<div className='flex mx-auto max-w-[80rem]' role='manuals' style={{ minHeight: mainHeight }}>
|
||||||
<TopicsList activeTopic={activeTopic} onChangeTopic={topic => onSelectTopic(topic)} />
|
<TopicsList activeTopic={activeTopic} onChangeTopic={topic => onSelectTopic(topic)} />
|
||||||
<ViewTopic topic={activeTopic} />
|
<ViewTopic topic={activeTopic} />
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -12,7 +12,11 @@ interface ViewTopicProps {
|
||||||
function ViewTopic({ topic }: ViewTopicProps) {
|
function ViewTopic({ topic }: ViewTopicProps) {
|
||||||
const { mainHeight } = useConceptOptions();
|
const { mainHeight } = useConceptOptions();
|
||||||
return (
|
return (
|
||||||
<AnimateFade key={topic} className='py-2 px-6 sm:px-12 overflow-y-auto' style={{ maxHeight: mainHeight }}>
|
<AnimateFade
|
||||||
|
key={topic}
|
||||||
|
className='py-2 px-6 mx-auto sm:mx-0 lg:px-12 overflow-y-auto'
|
||||||
|
style={{ maxHeight: mainHeight }}
|
||||||
|
>
|
||||||
<TopicPage topic={topic} />
|
<TopicPage topic={topic} />
|
||||||
</AnimateFade>
|
</AnimateFade>
|
||||||
);
|
);
|
||||||
|
|
|
@ -49,7 +49,7 @@ function EditorOssCard({ isModified, onDestroy, setIsModified }: EditorOssCardPr
|
||||||
/>
|
/>
|
||||||
<AnimateFade
|
<AnimateFade
|
||||||
onKeyDown={handleInput}
|
onKeyDown={handleInput}
|
||||||
className={clsx('md:w-fit md:max-w-fit max-w-[32rem]', 'mx-auto pt-[1.9rem]', 'flex flex-col md:flex-row px-6')}
|
className={clsx('md:w-fit md:max-w-fit max-w-[32rem]', 'mx-auto pt-[1.9rem]', 'flex flex-row flex-wrap px-6')}
|
||||||
>
|
>
|
||||||
<FlexColumn className='px-3'>
|
<FlexColumn className='px-3'>
|
||||||
<FormOSS id={globals.library_item_editor} isModified={isModified} setIsModified={setIsModified} />
|
<FormOSS id={globals.library_item_editor} isModified={isModified} setIsModified={setIsModified} />
|
||||||
|
|
|
@ -49,7 +49,7 @@ function EditorRSFormCard({ isModified, onDestroy, setIsModified }: EditorRSForm
|
||||||
/>
|
/>
|
||||||
<AnimateFade
|
<AnimateFade
|
||||||
onKeyDown={handleInput}
|
onKeyDown={handleInput}
|
||||||
className={clsx('md:w-fit md:max-w-fit max-w-[32rem] mx-auto', 'flex flex-col md:flex-row px-6 pt-[1.9rem]')}
|
className={clsx('md:w-fit md:max-w-fit max-w-[32rem] mx-auto', 'flex flex-row flex-wrap px-6 pt-[1.9rem]')}
|
||||||
>
|
>
|
||||||
<FlexColumn className='flex-shrink'>
|
<FlexColumn className='flex-shrink'>
|
||||||
<FormRSForm id={globals.library_item_editor} isModified={isModified} setIsModified={setIsModified} />
|
<FormRSForm id={globals.library_item_editor} isModified={isModified} setIsModified={setIsModified} />
|
||||||
|
|
|
@ -7,6 +7,14 @@
|
||||||
--font-ui: 'Alegreya Sans SC', 'Rubik', 'Noto Color Emoji', 'Segoe UI Symbol', sans-serif;
|
--font-ui: 'Alegreya Sans SC', 'Rubik', 'Noto Color Emoji', 'Segoe UI Symbol', sans-serif;
|
||||||
--font-main: 'Rubik', 'Noto Color Emoji', 'Fira Code', 'Noto Sans Math', 'Noto Sans Symbols 2', 'Segoe UI Symbol', sans-serif;
|
--font-main: 'Rubik', 'Noto Color Emoji', 'Fira Code', 'Noto Sans Math', 'Noto Sans Symbols 2', 'Segoe UI Symbol', sans-serif;
|
||||||
--font-math: 'Fira Code', 'Noto Sans Math', 'Noto Sans Symbols 2', 'Rubik', 'Noto Color Emoji', 'Segoe UI Symbol', sans-serif;
|
--font-math: 'Fira Code', 'Noto Sans Math', 'Noto Sans Symbols 2', 'Rubik', 'Noto Color Emoji', 'Segoe UI Symbol', sans-serif;
|
||||||
|
|
||||||
|
/* Numeric parameters */
|
||||||
|
--font-size-base: 16px;
|
||||||
|
--font-size-sm: 12px;
|
||||||
|
--line-height: 1.5;
|
||||||
|
|
||||||
|
--text-max-width: 75ch;
|
||||||
|
--scroll-padding: 3rem;
|
||||||
|
|
||||||
/* Light Theme */
|
/* Light Theme */
|
||||||
--cl-bg-120: hsl(000, 000%, 100%);
|
--cl-bg-120: hsl(000, 000%, 100%);
|
||||||
|
|
|
@ -8,22 +8,23 @@
|
||||||
@tailwind components;
|
@tailwind components;
|
||||||
@tailwind utilities;
|
@tailwind utilities;
|
||||||
|
|
||||||
html,
|
html {
|
||||||
body {
|
-webkit-text-size-adjust: none;
|
||||||
-webkit-text-size-adjust: 100%;
|
-moz-text-size-adjust: none;
|
||||||
|
text-size-adjust: none;
|
||||||
|
|
||||||
width: 100%;
|
hanging-punctuation: first last;
|
||||||
height: 100%;
|
color-scheme: dark light;
|
||||||
|
|
||||||
|
/* interpolate-size: allow-keywords; */
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
padding: 0px;
|
padding: 0px;
|
||||||
overflow-x: hidden;
|
overflow-x: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
html {
|
|
||||||
hanging-punctuation: first last;
|
|
||||||
color-scheme: dark light;
|
|
||||||
}
|
|
||||||
|
|
||||||
[data-color-scheme='dark'] {
|
[data-color-scheme='dark'] {
|
||||||
color-scheme: dark;
|
color-scheme: dark;
|
||||||
}
|
}
|
||||||
|
@ -36,13 +37,13 @@ html {
|
||||||
@media (prefers-reduced-motion: no-preference) {
|
@media (prefers-reduced-motion: no-preference) {
|
||||||
:has(:target) {
|
:has(:target) {
|
||||||
scroll-behavior: smooth;
|
scroll-behavior: smooth;
|
||||||
scroll-padding-top: 3rem;
|
scroll-padding-top: var(--scroll-padding);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
:root {
|
:root {
|
||||||
font-size: 16px;
|
font-size: var(--font-size-base);
|
||||||
line-height: 24px;
|
line-height: var(--line-height);
|
||||||
font-family: var(--font-main);
|
font-family: var(--font-main);
|
||||||
|
|
||||||
color: var(--cl-fg-100);
|
color: var(--cl-fg-100);
|
||||||
|
@ -58,8 +59,7 @@ html {
|
||||||
|
|
||||||
@media only screen and (max-width: 639px) {
|
@media only screen and (max-width: 639px) {
|
||||||
:root {
|
:root {
|
||||||
font-size: 12px;
|
font-size: var(--font-size-sm);
|
||||||
line-height: 18px;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -104,7 +104,7 @@ h6 {
|
||||||
/* Limit text lines and setup wrapping */
|
/* Limit text lines and setup wrapping */
|
||||||
p,
|
p,
|
||||||
li {
|
li {
|
||||||
max-width: 75ch;
|
max-width: var(--text-max-width);
|
||||||
text-wrap: pretty;
|
text-wrap: pretty;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -119,6 +119,9 @@ div:not(.dense) > p {
|
||||||
|
|
||||||
h2 {
|
h2 {
|
||||||
@apply [&:not(:first-child)]:mt-2 font-semibold text-center;
|
@apply [&:not(:first-child)]:mt-2 font-semibold text-center;
|
||||||
|
[role='manuals'] & {
|
||||||
|
@apply [&:not(:first-child)]:mt-3 mb-2;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
b {
|
b {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user