This is page 3 of 179. Use http://codebase.md/xmlui-org/xmlui/xmlui/mockApiDef.js?lines=true&page={x} to view the full context. # Directory Structure ``` ├── .changeset │ ├── cold-items-taste.md │ ├── config.json │ ├── empty-spiders-dress.md │ ├── shy-windows-allow.md │ ├── sour-coins-read.md │ ├── tame-zebras-invite.md │ ├── three-ideas-invent.md │ ├── twenty-jeans-watch.md │ ├── warm-spies-melt.md │ └── whole-ways-cry.md ├── .eslintrc.cjs ├── .github │ ├── build-checklist.png │ ├── ISSUE_TEMPLATE │ │ ├── bug_report.md │ │ └── feature_request.md │ └── workflows │ ├── deploy-docs-optimized.yml │ ├── deploy-docs.yml │ ├── prepare-versions.yml │ ├── release-packages.yml │ ├── run-all-tests.yml │ └── run-smoke-tests.yml ├── .gitignore ├── .prettierrc.js ├── .vscode │ ├── launch.json │ └── settings.json ├── blog │ ├── .gitignore │ ├── .gitkeep │ ├── CHANGELOG.md │ ├── extensions.ts │ ├── index.html │ ├── index.ts │ ├── package.json │ ├── public │ │ ├── blog │ │ │ ├── images │ │ │ │ ├── blog-page-component.png │ │ │ │ ├── blog-scrabble.png │ │ │ │ ├── integrated-blog-search.png │ │ │ │ └── lorem-ipsum.png │ │ │ ├── lorem-ipsum.md │ │ │ ├── newest-post.md │ │ │ ├── older-post.md │ │ │ └── welcome-to-the-xmlui-blog.md │ │ ├── mockServiceWorker.js │ │ ├── resources │ │ │ ├── favicon.ico │ │ │ ├── files │ │ │ │ └── for-download │ │ │ │ └── xmlui │ │ │ │ └── xmlui-standalone.umd.js │ │ │ ├── github.svg │ │ │ ├── llms.txt │ │ │ ├── logo-dark.svg │ │ │ ├── logo.svg │ │ │ ├── pg-popout.svg │ │ │ └── xmlui-logo.svg │ │ ├── serve.json │ │ └── web.config │ ├── scripts │ │ ├── download-latest-xmlui.js │ │ ├── generate-rss.js │ │ ├── get-releases.js │ │ └── utils.js │ ├── src │ │ ├── components │ │ │ ├── BlogOverview.xmlui │ │ │ ├── BlogPage.xmlui │ │ │ └── PageNotFound.xmlui │ │ ├── config.ts │ │ ├── Main.xmlui │ │ └── themes │ │ ├── docs-theme.ts │ │ ├── earthtone.ts │ │ ├── xmlui-gray-on-default.ts │ │ ├── xmlui-green-on-default.ts │ │ └── xmlui-orange-on-default.ts │ └── tsconfig.json ├── CONTRIBUTING.md ├── docs │ ├── .gitignore │ ├── CHANGELOG.md │ ├── ComponentRefLinks.txt │ ├── content │ │ ├── _meta.json │ │ ├── components │ │ │ ├── _meta.json │ │ │ ├── _overview.md │ │ │ ├── APICall.md │ │ │ ├── App.md │ │ │ ├── AppHeader.md │ │ │ ├── AppState.md │ │ │ ├── AutoComplete.md │ │ │ ├── Avatar.md │ │ │ ├── Backdrop.md │ │ │ ├── Badge.md │ │ │ ├── BarChart.md │ │ │ ├── Bookmark.md │ │ │ ├── Breakout.md │ │ │ ├── Button.md │ │ │ ├── Card.md │ │ │ ├── Carousel.md │ │ │ ├── ChangeListener.md │ │ │ ├── Checkbox.md │ │ │ ├── CHStack.md │ │ │ ├── ColorPicker.md │ │ │ ├── Column.md │ │ │ ├── ContentSeparator.md │ │ │ ├── CVStack.md │ │ │ ├── DataSource.md │ │ │ ├── DateInput.md │ │ │ ├── DatePicker.md │ │ │ ├── DonutChart.md │ │ │ ├── DropdownMenu.md │ │ │ ├── EmojiSelector.md │ │ │ ├── ExpandableItem.md │ │ │ ├── FileInput.md │ │ │ ├── FileUploadDropZone.md │ │ │ ├── FlowLayout.md │ │ │ ├── Footer.md │ │ │ ├── Form.md │ │ │ ├── FormItem.md │ │ │ ├── FormSection.md │ │ │ ├── Fragment.md │ │ │ ├── H1.md │ │ │ ├── H2.md │ │ │ ├── H3.md │ │ │ ├── H4.md │ │ │ ├── H5.md │ │ │ ├── H6.md │ │ │ ├── Heading.md │ │ │ ├── HSplitter.md │ │ │ ├── HStack.md │ │ │ ├── Icon.md │ │ │ ├── IFrame.md │ │ │ ├── Image.md │ │ │ ├── Items.md │ │ │ ├── LabelList.md │ │ │ ├── Legend.md │ │ │ ├── LineChart.md │ │ │ ├── Link.md │ │ │ ├── List.md │ │ │ ├── Logo.md │ │ │ ├── Markdown.md │ │ │ ├── MenuItem.md │ │ │ ├── MenuSeparator.md │ │ │ ├── ModalDialog.md │ │ │ ├── NavGroup.md │ │ │ ├── NavLink.md │ │ │ ├── NavPanel.md │ │ │ ├── NoResult.md │ │ │ ├── NumberBox.md │ │ │ ├── Option.md │ │ │ ├── Page.md │ │ │ ├── PageMetaTitle.md │ │ │ ├── Pages.md │ │ │ ├── Pagination.md │ │ │ ├── PasswordInput.md │ │ │ ├── PieChart.md │ │ │ ├── ProgressBar.md │ │ │ ├── Queue.md │ │ │ ├── RadioGroup.md │ │ │ ├── RealTimeAdapter.md │ │ │ ├── Redirect.md │ │ │ ├── Select.md │ │ │ ├── Slider.md │ │ │ ├── Slot.md │ │ │ ├── SpaceFiller.md │ │ │ ├── Spinner.md │ │ │ ├── Splitter.md │ │ │ ├── Stack.md │ │ │ ├── StickyBox.md │ │ │ ├── SubMenuItem.md │ │ │ ├── Switch.md │ │ │ ├── TabItem.md │ │ │ ├── Table.md │ │ │ ├── TableOfContents.md │ │ │ ├── Tabs.md │ │ │ ├── Text.md │ │ │ ├── TextArea.md │ │ │ ├── TextBox.md │ │ │ ├── Theme.md │ │ │ ├── TimeInput.md │ │ │ ├── Timer.md │ │ │ ├── ToneChangerButton.md │ │ │ ├── ToneSwitch.md │ │ │ ├── Tooltip.md │ │ │ ├── Tree.md │ │ │ ├── VSplitter.md │ │ │ ├── VStack.md │ │ │ ├── xmlui-animations │ │ │ │ ├── _meta.json │ │ │ │ ├── _overview.md │ │ │ │ ├── Animation.md │ │ │ │ ├── FadeAnimation.md │ │ │ │ ├── FadeInAnimation.md │ │ │ │ ├── FadeOutAnimation.md │ │ │ │ ├── ScaleAnimation.md │ │ │ │ └── SlideInAnimation.md │ │ │ ├── xmlui-pdf │ │ │ │ ├── _meta.json │ │ │ │ ├── _overview.md │ │ │ │ └── Pdf.md │ │ │ ├── xmlui-spreadsheet │ │ │ │ ├── _meta.json │ │ │ │ ├── _overview.md │ │ │ │ └── Spreadsheet.md │ │ │ └── xmlui-website-blocks │ │ │ ├── _meta.json │ │ │ ├── _overview.md │ │ │ ├── Carousel.md │ │ │ ├── HelloMd.md │ │ │ ├── HeroSection.md │ │ │ └── ScrollToTop.md │ │ └── extensions │ │ ├── _meta.json │ │ ├── xmlui-animations │ │ │ ├── _meta.json │ │ │ ├── _overview.md │ │ │ ├── Animation.md │ │ │ ├── FadeAnimation.md │ │ │ ├── FadeInAnimation.md │ │ │ ├── FadeOutAnimation.md │ │ │ ├── ScaleAnimation.md │ │ │ └── SlideInAnimation.md │ │ └── xmlui-website-blocks │ │ ├── _meta.json │ │ ├── _overview.md │ │ ├── Carousel.md │ │ ├── HelloMd.md │ │ ├── HeroSection.md │ │ └── ScrollToTop.md │ ├── extensions.ts │ ├── index.html │ ├── index.ts │ ├── package.json │ ├── public │ │ ├── feed.rss │ │ ├── mockServiceWorker.js │ │ ├── pages │ │ │ ├── _meta.json │ │ │ ├── app-structure.md │ │ │ ├── build-editor-component.md │ │ │ ├── build-hello-world-component.md │ │ │ ├── components-intro.md │ │ │ ├── context-variables.md │ │ │ ├── forms.md │ │ │ ├── globals.md │ │ │ ├── glossary.md │ │ │ ├── helper-tags.md │ │ │ ├── hosted-deployment.md │ │ │ ├── howto │ │ │ │ ├── assign-a-complex-json-literal-to-a-component-variable.md │ │ │ │ ├── chain-a-refetch.md │ │ │ │ ├── debug-a-component.md │ │ │ │ ├── delay-a-datasource-until-another-datasource-is-ready.md │ │ │ │ ├── delegate-a-method.md │ │ │ │ ├── do-custom-form-validation.md │ │ │ │ ├── expose-a-method-from-a-component.md │ │ │ │ ├── filter-and-transform-data-from-an-api.md │ │ │ │ ├── group-items-in-list-by-a-property.md │ │ │ │ ├── handle-background-operations.md │ │ │ │ ├── hide-an-element-until-its-datasource-is-ready.md │ │ │ │ ├── make-a-set-of-equal-width-cards.md │ │ │ │ ├── make-a-table-responsive.md │ │ │ │ ├── modify-a-value-reported-in-a-column.md │ │ │ │ ├── paginate-a-list.md │ │ │ │ ├── pass-data-to-a-modal-dialog.md │ │ │ │ ├── react-to-button-click-not-keystrokes.md │ │ │ │ ├── set-the-initial-value-of-a-select-from-fetched-data.md │ │ │ │ ├── share-a-modaldialog-across-components.md │ │ │ │ ├── sync-selections-between-table-and-list-views.md │ │ │ │ ├── update-ui-optimistically.md │ │ │ │ ├── use-built-in-form-validation.md │ │ │ │ └── use-the-same-modaldialog-to-add-or-edit.md │ │ │ ├── howto.md │ │ │ ├── intro.md │ │ │ ├── layout.md │ │ │ ├── markup.md │ │ │ ├── mcp.md │ │ │ ├── modal-dialogs.md │ │ │ ├── news-and-reviews.md │ │ │ ├── reactive-intro.md │ │ │ ├── refactoring.md │ │ │ ├── routing-and-links.md │ │ │ ├── samples │ │ │ │ ├── color-palette.xmlui │ │ │ │ ├── color-values.xmlui │ │ │ │ ├── shadow-sizes.xmlui │ │ │ │ ├── spacing-sizes.xmlui │ │ │ │ ├── swatch.xmlui │ │ │ │ ├── theme-gallery-brief.xmlui │ │ │ │ └── theme-gallery.xmlui │ │ │ ├── scoping.md │ │ │ ├── scripting.md │ │ │ ├── styles-and-themes │ │ │ │ ├── common-units.md │ │ │ │ ├── layout-props.md │ │ │ │ ├── theme-variable-defaults.md │ │ │ │ ├── theme-variables.md │ │ │ │ └── themes.md │ │ │ ├── template-properties.md │ │ │ ├── test.md │ │ │ ├── tutorial-01.md │ │ │ ├── tutorial-02.md │ │ │ ├── tutorial-03.md │ │ │ ├── tutorial-04.md │ │ │ ├── tutorial-05.md │ │ │ ├── tutorial-06.md │ │ │ ├── tutorial-07.md │ │ │ ├── tutorial-08.md │ │ │ ├── tutorial-09.md │ │ │ ├── tutorial-10.md │ │ │ ├── tutorial-11.md │ │ │ ├── tutorial-12.md │ │ │ ├── universal-properties.md │ │ │ ├── user-defined-components.md │ │ │ ├── vscode.md │ │ │ ├── working-with-markdown.md │ │ │ ├── working-with-text.md │ │ │ ├── xmlui-animations │ │ │ │ ├── _meta.json │ │ │ │ ├── _overview.md │ │ │ │ ├── Animation.md │ │ │ │ ├── FadeAnimation.md │ │ │ │ ├── FadeInAnimation.md │ │ │ │ ├── FadeOutAnimation.md │ │ │ │ ├── ScaleAnimation.md │ │ │ │ └── SlideInAnimation.md │ │ │ ├── xmlui-charts │ │ │ │ ├── _meta.json │ │ │ │ ├── _overview.md │ │ │ │ ├── BarChart.md │ │ │ │ ├── DonutChart.md │ │ │ │ ├── LabelList.md │ │ │ │ ├── Legend.md │ │ │ │ ├── LineChart.md │ │ │ │ └── PieChart.md │ │ │ ├── xmlui-pdf │ │ │ │ ├── _meta.json │ │ │ │ ├── _overview.md │ │ │ │ └── Pdf.md │ │ │ └── xmlui-spreadsheet │ │ │ ├── _meta.json │ │ │ ├── _overview.md │ │ │ └── Spreadsheet.md │ │ ├── resources │ │ │ ├── devdocs │ │ │ │ ├── debug-proxy-object-2.png │ │ │ │ ├── debug-proxy-object.png │ │ │ │ ├── table_editor_01.png │ │ │ │ ├── table_editor_02.png │ │ │ │ ├── table_editor_03.png │ │ │ │ ├── table_editor_04.png │ │ │ │ ├── table_editor_05.png │ │ │ │ ├── table_editor_06.png │ │ │ │ ├── table_editor_07.png │ │ │ │ ├── table_editor_08.png │ │ │ │ ├── table_editor_09.png │ │ │ │ ├── table_editor_10.png │ │ │ │ ├── table_editor_11.png │ │ │ │ ├── table-editor-01.png │ │ │ │ ├── table-editor-02.png │ │ │ │ ├── table-editor-03.png │ │ │ │ ├── table-editor-04.png │ │ │ │ ├── table-editor-06.png │ │ │ │ ├── table-editor-07.png │ │ │ │ ├── table-editor-08.png │ │ │ │ ├── table-editor-09.png │ │ │ │ └── xmlui-rendering-of-tiptap-markdown.png │ │ │ ├── favicon.ico │ │ │ ├── files │ │ │ │ ├── clients.json │ │ │ │ ├── daily-revenue.json │ │ │ │ ├── dashboard-stats.json │ │ │ │ ├── demo.xmlui │ │ │ │ ├── demo.xmlui.xs │ │ │ │ ├── downloads │ │ │ │ │ └── downloads.json │ │ │ │ ├── for-download │ │ │ │ │ ├── index-with-api.html │ │ │ │ │ ├── index.html │ │ │ │ │ ├── mockApi.js │ │ │ │ │ ├── start-darwin.sh │ │ │ │ │ ├── start-linux.sh │ │ │ │ │ ├── start.bat │ │ │ │ │ └── xmlui │ │ │ │ │ └── xmlui-standalone.umd.js │ │ │ │ ├── getting-started │ │ │ │ │ ├── cl-tutorial-final.zip │ │ │ │ │ ├── cl-tutorial.zip │ │ │ │ │ ├── cl-tutorial2.zip │ │ │ │ │ ├── cl-tutorial3.zip │ │ │ │ │ ├── cl-tutorial4.zip │ │ │ │ │ ├── cl-tutorial5.zip │ │ │ │ │ ├── cl-tutorial6.zip │ │ │ │ │ ├── getting-started.zip │ │ │ │ │ ├── hello-xmlui.zip │ │ │ │ │ ├── xmlui-empty.zip │ │ │ │ │ └── xmlui-starter.zip │ │ │ │ ├── howto │ │ │ │ │ └── component-icons │ │ │ │ │ └── up-arrow.svg │ │ │ │ ├── invoices.json │ │ │ │ ├── monthly-status.json │ │ │ │ ├── news-and-reviews.json │ │ │ │ ├── products.json │ │ │ │ ├── releases.json │ │ │ │ ├── tutorials │ │ │ │ │ ├── datasource │ │ │ │ │ │ └── api.ts │ │ │ │ │ └── p2do │ │ │ │ │ ├── api.ts │ │ │ │ │ └── todo-logo.svg │ │ │ │ └── xmlui.json │ │ │ ├── github.svg │ │ │ ├── images │ │ │ │ ├── apiaction-tutorial │ │ │ │ │ ├── add-success.png │ │ │ │ │ ├── apiaction-param.png │ │ │ │ │ ├── change-completed.png │ │ │ │ │ ├── change-in-progress.png │ │ │ │ │ ├── confirm-delete.png │ │ │ │ │ ├── data-error.png │ │ │ │ │ ├── data-progress.png │ │ │ │ │ ├── data-success.png │ │ │ │ │ ├── display-1.png │ │ │ │ │ ├── item-deleted.png │ │ │ │ │ ├── item-updated.png │ │ │ │ │ ├── missing-api-key.png │ │ │ │ │ ├── new-item-added.png │ │ │ │ │ └── test-message.png │ │ │ │ ├── chat-api │ │ │ │ │ └── domain-model.svg │ │ │ │ ├── components │ │ │ │ │ ├── image │ │ │ │ │ │ └── breakfast.jpg │ │ │ │ │ ├── markdown │ │ │ │ │ │ └── colors.png │ │ │ │ │ └── modal │ │ │ │ │ ├── deep_link_dialog_1.jpg │ │ │ │ │ └── deep_link_dialog_2.jpg │ │ │ │ ├── create-apps │ │ │ │ │ ├── collapsed-vertical.png │ │ │ │ │ ├── using-forms-warning-dialog.png │ │ │ │ │ └── using-forms.png │ │ │ │ ├── datasource-tutorial │ │ │ │ │ ├── data-with-header.png │ │ │ │ │ ├── filtered-data.png │ │ │ │ │ ├── filtered-items.png │ │ │ │ │ ├── initial-page-items.png │ │ │ │ │ ├── list-items.png │ │ │ │ │ ├── next-page-items.png │ │ │ │ │ ├── no-data.png │ │ │ │ │ ├── pagination-1.jpg │ │ │ │ │ ├── pagination-1.png │ │ │ │ │ ├── polling-1.png │ │ │ │ │ ├── refetch-data.png │ │ │ │ │ ├── slow-loading.png │ │ │ │ │ ├── test-message.png │ │ │ │ │ ├── Thumbs.db │ │ │ │ │ ├── unconventional-data.png │ │ │ │ │ └── unfiltered-items.png │ │ │ │ ├── flower.jpg │ │ │ │ ├── get-started │ │ │ │ │ ├── add-new-contact.png │ │ │ │ │ ├── app-modified.png │ │ │ │ │ ├── app-start.png │ │ │ │ │ ├── app-with-boxes.png │ │ │ │ │ ├── app-with-toast.png │ │ │ │ │ ├── boilerplate-structure.png │ │ │ │ │ ├── cl-initial.png │ │ │ │ │ ├── cl-start.png │ │ │ │ │ ├── contact-counts.png │ │ │ │ │ ├── contact-dialog-title.png │ │ │ │ │ ├── contact-dialog.png │ │ │ │ │ ├── contact-menus.png │ │ │ │ │ ├── contact-predicates.png │ │ │ │ │ ├── context-menu.png │ │ │ │ │ ├── dashboard-numbers.png │ │ │ │ │ ├── default-contact-list.png │ │ │ │ │ ├── delete-contact.png │ │ │ │ │ ├── delete-task.png │ │ │ │ │ ├── detailed-template.png │ │ │ │ │ ├── edit-contact-details.png │ │ │ │ │ ├── edited-contact-saved.png │ │ │ │ │ ├── empty-sections.png │ │ │ │ │ ├── filter-completed.png │ │ │ │ │ ├── fullwidth-desktop.png │ │ │ │ │ ├── fullwidth-mobile.png │ │ │ │ │ ├── initial-table.png │ │ │ │ │ ├── items-and-badges.png │ │ │ │ │ ├── loading-message.png │ │ │ │ │ ├── new-contact-button.png │ │ │ │ │ ├── new-contact-saved.png │ │ │ │ │ ├── no-empty-sections.png │ │ │ │ │ ├── personal-todo-initial.png │ │ │ │ │ ├── piechart.png │ │ │ │ │ ├── review-today.png │ │ │ │ │ ├── rudimentary-dashboard.png │ │ │ │ │ ├── section-collapsed.png │ │ │ │ │ ├── sectioned-items.png │ │ │ │ │ ├── sections-ordered.png │ │ │ │ │ ├── spacex-list-with-links.png │ │ │ │ │ ├── spacex-list.png │ │ │ │ │ ├── start-personal-todo-1.png │ │ │ │ │ ├── submit-new-contact.png │ │ │ │ │ ├── submit-new-task.png │ │ │ │ │ ├── syntax-highlighting.png │ │ │ │ │ ├── table-with-badge.png │ │ │ │ │ ├── template-with-card.png │ │ │ │ │ ├── test-emulated-api.png │ │ │ │ │ ├── Thumbs.db │ │ │ │ │ ├── todo-logo.png │ │ │ │ │ └── xmlui-tools.png │ │ │ │ ├── HelloApp.png │ │ │ │ ├── HelloApp2.png │ │ │ │ ├── logos │ │ │ │ │ ├── xmlui1.svg │ │ │ │ │ ├── xmlui2.svg │ │ │ │ │ ├── xmlui3.svg │ │ │ │ │ ├── xmlui4.svg │ │ │ │ │ ├── xmlui5.svg │ │ │ │ │ ├── xmlui6.svg │ │ │ │ │ └── xmlui7.svg │ │ │ │ ├── pdf │ │ │ │ │ └── dummy-pdf.jpg │ │ │ │ ├── rendering-engine │ │ │ │ │ ├── AppEngine-flow.svg │ │ │ │ │ ├── Component.svg │ │ │ │ │ ├── CompoundComponent.svg │ │ │ │ │ ├── RootComponent.svg │ │ │ │ │ └── tree-with-containers.svg │ │ │ │ ├── reviewers-guide │ │ │ │ │ ├── AppEngine-flow.svg │ │ │ │ │ └── incbutton-in-action.png │ │ │ │ ├── tools │ │ │ │ │ └── boilerplate-structure.png │ │ │ │ ├── try.svg │ │ │ │ ├── tutorial │ │ │ │ │ ├── app-chat-history.png │ │ │ │ │ ├── app-content-placeholder.png │ │ │ │ │ ├── app-header-and-content.png │ │ │ │ │ ├── app-links-channel-selected.png │ │ │ │ │ ├── app-links-click.png │ │ │ │ │ ├── app-navigation.png │ │ │ │ │ ├── finished-ex01.png │ │ │ │ │ ├── finished-ex02.png │ │ │ │ │ ├── hello.png │ │ │ │ │ ├── splash-screen-advanced.png │ │ │ │ │ ├── splash-screen-after-click.png │ │ │ │ │ ├── splash-screen-centered.png │ │ │ │ │ ├── splash-screen-events.png │ │ │ │ │ ├── splash-screen-expression.png │ │ │ │ │ ├── splash-screen-reuse-after.png │ │ │ │ │ ├── splash-screen-reuse-before.png │ │ │ │ │ └── splash-screen.png │ │ │ │ └── tutorial-01.png │ │ │ ├── llms.txt │ │ │ ├── logo-dark.svg │ │ │ ├── logo.svg │ │ │ ├── pg-popout.svg │ │ │ └── xmlui-logo.svg │ │ ├── serve.json │ │ └── web.config │ ├── scripts │ │ ├── download-latest-xmlui.js │ │ ├── generate-rss.js │ │ ├── get-releases.js │ │ └── utils.js │ ├── src │ │ ├── components │ │ │ ├── BlogOverview.xmlui │ │ │ ├── BlogPage.xmlui │ │ │ ├── Boxes.xmlui │ │ │ ├── Breadcrumb.xmlui │ │ │ ├── ChangeLog.xmlui │ │ │ ├── ColorPalette.xmlui │ │ │ ├── DocumentLinks.xmlui │ │ │ ├── DocumentPage.xmlui │ │ │ ├── DocumentPageNoTOC.xmlui │ │ │ ├── Icons.xmlui │ │ │ ├── IncButton.xmlui │ │ │ ├── IncButton2.xmlui │ │ │ ├── NameValue.xmlui │ │ │ ├── PageNotFound.xmlui │ │ │ ├── PaletteItem.xmlui │ │ │ ├── Palettes.xmlui │ │ │ ├── SectionHeader.xmlui │ │ │ ├── TBD.xmlui │ │ │ ├── Test.xmlui │ │ │ ├── ThemesIntro.xmlui │ │ │ ├── ThousandThemes.xmlui │ │ │ ├── TubeStops.xmlui │ │ │ ├── TubeStops.xmlui.xs │ │ │ └── TwoColumnCode.xmlui │ │ ├── config.ts │ │ ├── Main.xmlui │ │ └── themes │ │ ├── docs-theme.ts │ │ ├── earthtone.ts │ │ ├── xmlui-gray-on-default.ts │ │ ├── xmlui-green-on-default.ts │ │ └── xmlui-orange-on-default.ts │ └── tsconfig.json ├── LICENSE ├── package-lock.json ├── package.json ├── packages │ ├── xmlui-animations │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── demo │ │ │ └── Main.xmlui │ │ ├── index.html │ │ ├── index.ts │ │ ├── meta │ │ │ └── componentsMetadata.ts │ │ ├── package.json │ │ ├── src │ │ │ ├── Animation.tsx │ │ │ ├── AnimationNative.tsx │ │ │ ├── FadeAnimation.tsx │ │ │ ├── FadeInAnimation.tsx │ │ │ ├── FadeOutAnimation.tsx │ │ │ ├── index.tsx │ │ │ ├── ScaleAnimation.tsx │ │ │ └── SlideInAnimation.tsx │ │ └── tsconfig.json │ ├── xmlui-devtools │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── demo │ │ │ └── Main.xmlui │ │ ├── index.html │ │ ├── index.ts │ │ ├── meta │ │ │ └── componentsMetadata.ts │ │ ├── package.json │ │ ├── src │ │ │ ├── devtools │ │ │ │ ├── DevTools.tsx │ │ │ │ ├── DevToolsNative.module.scss │ │ │ │ ├── DevToolsNative.tsx │ │ │ │ ├── ModalDialog.module.scss │ │ │ │ ├── ModalDialog.tsx │ │ │ │ ├── ModalVisibilityContext.tsx │ │ │ │ ├── Tooltip.module.scss │ │ │ │ ├── Tooltip.tsx │ │ │ │ └── utils.ts │ │ │ ├── editor │ │ │ │ └── Editor.tsx │ │ │ └── index.tsx │ │ ├── tsconfig.json │ │ └── vite.config-overrides.ts │ ├── xmlui-hello-world │ │ ├── .gitignore │ │ ├── index.ts │ │ ├── meta │ │ │ └── componentsMetadata.ts │ │ ├── package.json │ │ ├── src │ │ │ ├── HelloWorld.module.scss │ │ │ ├── HelloWorld.tsx │ │ │ ├── HelloWorldNative.tsx │ │ │ └── index.tsx │ │ └── tsconfig.json │ ├── xmlui-os-frames │ │ ├── .gitignore │ │ ├── demo │ │ │ └── Main.xmlui │ │ ├── index.html │ │ ├── index.ts │ │ ├── meta │ │ │ └── componentsMetadata.ts │ │ ├── package.json │ │ ├── src │ │ │ ├── index.tsx │ │ │ ├── IPhoneFrame.module.scss │ │ │ ├── IPhoneFrame.tsx │ │ │ ├── MacOSAppFrame.module.scss │ │ │ ├── MacOSAppFrame.tsx │ │ │ ├── WindowsAppFrame.module.scss │ │ │ └── WindowsAppFrame.tsx │ │ └── tsconfig.json │ ├── xmlui-pdf │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── demo │ │ │ ├── components │ │ │ │ └── Pdf.xmlui │ │ │ └── Main.xmlui │ │ ├── index.html │ │ ├── index.ts │ │ ├── meta │ │ │ └── componentsMetadata.ts │ │ ├── package.json │ │ ├── src │ │ │ ├── index.tsx │ │ │ ├── LazyPdfNative.tsx │ │ │ ├── Pdf.module.scss │ │ │ └── Pdf.tsx │ │ └── tsconfig.json │ ├── xmlui-playground │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── demo │ │ │ └── Main.xmlui │ │ ├── index.html │ │ ├── index.ts │ │ ├── meta │ │ │ └── componentsMetadata.ts │ │ ├── package.json │ │ ├── src │ │ │ ├── hooks │ │ │ │ ├── usePlayground.ts │ │ │ │ └── useToast.ts │ │ │ ├── index.tsx │ │ │ ├── playground │ │ │ │ ├── Box.module.scss │ │ │ │ ├── Box.tsx │ │ │ │ ├── CodeSelector.tsx │ │ │ │ ├── ConfirmationDialog.module.scss │ │ │ │ ├── ConfirmationDialog.tsx │ │ │ │ ├── Editor.tsx │ │ │ │ ├── Header.module.scss │ │ │ │ ├── Header.tsx │ │ │ │ ├── Playground.tsx │ │ │ │ ├── PlaygroundContent.module.scss │ │ │ │ ├── PlaygroundContent.tsx │ │ │ │ ├── PlaygroundNative.module.scss │ │ │ │ ├── PlaygroundNative.tsx │ │ │ │ ├── Preview.module.scss │ │ │ │ ├── Preview.tsx │ │ │ │ ├── Select.module.scss │ │ │ │ ├── StandalonePlayground.tsx │ │ │ │ ├── StandalonePlaygroundNative.module.scss │ │ │ │ ├── StandalonePlaygroundNative.tsx │ │ │ │ ├── ThemeSwitcher.module.scss │ │ │ │ ├── ThemeSwitcher.tsx │ │ │ │ ├── ToneSwitcher.tsx │ │ │ │ ├── Tooltip.module.scss │ │ │ │ ├── Tooltip.tsx │ │ │ │ └── utils.ts │ │ │ ├── providers │ │ │ │ ├── Toast.module.scss │ │ │ │ └── ToastProvider.tsx │ │ │ ├── state │ │ │ │ └── store.ts │ │ │ ├── themes │ │ │ │ └── theme.ts │ │ │ └── utils │ │ │ └── helpers.ts │ │ └── tsconfig.json │ ├── xmlui-search │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── demo │ │ │ └── Main.xmlui │ │ ├── index.html │ │ ├── index.ts │ │ ├── meta │ │ │ └── componentsMetadata.ts │ │ ├── package.json │ │ ├── src │ │ │ ├── index.tsx │ │ │ ├── Search.module.scss │ │ │ └── Search.tsx │ │ └── tsconfig.json │ ├── xmlui-spreadsheet │ │ ├── .gitignore │ │ ├── demo │ │ │ └── Main.xmlui │ │ ├── index.html │ │ ├── index.ts │ │ ├── meta │ │ │ └── componentsMetadata.ts │ │ ├── package.json │ │ ├── src │ │ │ ├── index.tsx │ │ │ ├── Spreadsheet.tsx │ │ │ └── SpreadsheetNative.tsx │ │ └── tsconfig.json │ └── xmlui-website-blocks │ ├── .gitignore │ ├── CHANGELOG.md │ ├── demo │ │ ├── components │ │ │ ├── HeroBackgroundBreakoutPage.xmlui │ │ │ ├── HeroBackgroundsPage.xmlui │ │ │ ├── HeroContentsPage.xmlui │ │ │ ├── HeroTextAlignPage.xmlui │ │ │ ├── HeroTextPage.xmlui │ │ │ └── HeroTonesPage.xmlui │ │ ├── Main.xmlui │ │ └── themes │ │ └── default.ts │ ├── index.html │ ├── index.ts │ ├── meta │ │ └── componentsMetadata.ts │ ├── package.json │ ├── public │ │ └── resources │ │ ├── building.jpg │ │ └── xmlui-logo.svg │ ├── src │ │ ├── Carousel │ │ │ ├── Carousel.module.scss │ │ │ ├── Carousel.tsx │ │ │ ├── CarouselContext.tsx │ │ │ └── CarouselNative.tsx │ │ ├── FancyButton │ │ │ ├── FancyButton.module.scss │ │ │ ├── FancyButton.tsx │ │ │ └── FancyButton.xmlui │ │ ├── Hello │ │ │ ├── Hello.tsx │ │ │ ├── Hello.xmlui │ │ │ └── Hello.xmlui.xs │ │ ├── HeroSection │ │ │ ├── HeroSection.module.scss │ │ │ ├── HeroSection.tsx │ │ │ └── HeroSectionNative.tsx │ │ ├── index.tsx │ │ ├── ScrollToTop │ │ │ ├── ScrollToTop.module.scss │ │ │ ├── ScrollToTop.tsx │ │ │ └── ScrollToTopNative.tsx │ │ └── vite-env.d.ts │ └── tsconfig.json ├── README.md ├── tools │ ├── codefence │ │ └── xmlui-code-fence-docs.md │ ├── create-app │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── create-app.ts │ │ ├── helpers │ │ │ ├── copy.ts │ │ │ ├── get-pkg-manager.ts │ │ │ ├── git.ts │ │ │ ├── install.ts │ │ │ ├── is-folder-empty.ts │ │ │ ├── is-writeable.ts │ │ │ ├── make-dir.ts │ │ │ └── validate-pkg.ts │ │ ├── index.ts │ │ ├── package.json │ │ ├── templates │ │ │ ├── default │ │ │ │ └── ts │ │ │ │ ├── gitignore │ │ │ │ ├── index.html │ │ │ │ ├── index.ts │ │ │ │ ├── public │ │ │ │ │ ├── mockServiceWorker.js │ │ │ │ │ ├── resources │ │ │ │ │ │ ├── favicon.ico │ │ │ │ │ │ └── xmlui-logo.svg │ │ │ │ │ └── serve.json │ │ │ │ └── src │ │ │ │ ├── components │ │ │ │ │ ├── ApiAware.xmlui │ │ │ │ │ ├── Home.xmlui │ │ │ │ │ ├── IncButton.xmlui │ │ │ │ │ └── PagePanel.xmlui │ │ │ │ ├── config.ts │ │ │ │ └── Main.xmlui │ │ │ ├── index.ts │ │ │ └── types.ts │ │ └── tsconfig.json │ ├── create-xmlui-hello-world │ │ ├── index.js │ │ └── package.json │ └── vscode │ ├── .gitignore │ ├── .vscode │ │ ├── launch.json │ │ └── tasks.json │ ├── .vscodeignore │ ├── build.sh │ ├── CHANGELOG.md │ ├── esbuild.js │ ├── eslint.config.mjs │ ├── formatter-docs.md │ ├── generate-test-sample.sh │ ├── LICENSE.md │ ├── package-lock.json │ ├── package.json │ ├── README.md │ ├── resources │ │ ├── xmlui-logo.png │ │ └── xmlui-markup-syntax-highlighting.png │ ├── src │ │ ├── extension.ts │ │ └── server.ts │ ├── syntaxes │ │ └── xmlui.tmLanguage.json │ ├── test-samples │ │ └── sample.xmlui │ ├── tsconfig.json │ └── tsconfig.tsbuildinfo ├── turbo.json └── xmlui ├── .gitignore ├── bin │ ├── bootstrap.js │ ├── build-lib.ts │ ├── build.ts │ ├── index.ts │ ├── preview.ts │ ├── start.ts │ ├── vite-xmlui-plugin.ts │ └── viteConfig.ts ├── CHANGELOG.md ├── conventions │ ├── component-qa-checklist.md │ ├── copilot-conventions.md │ ├── create-xmlui-components.md │ ├── mermaid.md │ ├── testing-conventions.md │ └── xmlui-in-a-nutshell.md ├── dev-docs │ ├── accessibility.md │ ├── actions.md │ ├── AppRoot.md │ ├── component-apis.md │ ├── component-rendering.md │ ├── component-review-checklist.md │ ├── containers.md │ ├── data-sources.md │ ├── e2e-summary.md │ ├── expression-evaluation.md │ ├── glossary.md │ ├── helper-components.md │ ├── index.md │ ├── loaders.md │ ├── next │ │ ├── component-dev-guide.md │ │ ├── configuration-management-enhancement-summary.md │ │ ├── documentation-scripts-refactoring-complete-summary.md │ │ ├── documentation-scripts-refactoring-plan.md │ │ ├── duplicate-pattern-extraction-summary.md │ │ ├── error-handling-standardization-summary.md │ │ ├── generating-component-reference.md │ │ ├── index.md │ │ ├── logging-consistency-implementation-summary.md │ │ ├── project-build.md │ │ ├── project-structure.md │ │ ├── theme-context.md │ │ ├── tiptap-design-considerations.md │ │ ├── working-with-code.md │ │ ├── xmlui-runtime-architecture │ │ └── xmlui-wcag-accessibility-report.md │ ├── react-fundamentals.md │ ├── release-method.md │ ├── rendering-fundamentals.md │ ├── reusable-components.md │ ├── standalone-apps.md │ ├── state-management.md │ └── xmlui-extensibility.xlsx ├── package.json ├── playwright.config.ts ├── scripts │ ├── coverage-only.js │ ├── e2e-test-summary.js │ ├── generate-docs │ │ ├── build-downloads-map.mjs │ │ ├── build-pages-map.mjs │ │ ├── components-config.json │ │ ├── configuration-management.mjs │ │ ├── constants.mjs │ │ ├── create-theme-files.mjs │ │ ├── DocsGenerator.mjs │ │ ├── error-handling.mjs │ │ ├── extensions-config.json │ │ ├── folders.mjs │ │ ├── generate-summary-files.mjs │ │ ├── get-docs.mjs │ │ ├── input-handler.mjs │ │ ├── logger.mjs │ │ ├── logging-standards.mjs │ │ ├── MetadataProcessor.mjs │ │ ├── pattern-utilities.mjs │ │ └── utils.mjs │ ├── get-langserver-metadata.mjs │ ├── inline-links.mjs │ └── README-e2e-summary.md ├── src │ ├── abstractions │ │ ├── _conventions.md │ │ ├── ActionDefs.ts │ │ ├── AppContextDefs.ts │ │ ├── ComponentDefs.ts │ │ ├── ContainerDefs.ts │ │ ├── ExtensionDefs.ts │ │ ├── FunctionDefs.ts │ │ ├── RendererDefs.ts │ │ ├── scripting │ │ │ ├── BlockScope.ts │ │ │ ├── Compilation.ts │ │ │ ├── LogicalThread.ts │ │ │ ├── LoopScope.ts │ │ │ ├── modules.ts │ │ │ ├── ScriptParserError.ts │ │ │ ├── Token.ts │ │ │ ├── TryScope.ts │ │ │ └── TryScopeExp.ts │ │ └── ThemingDefs.ts │ ├── components │ │ ├── _conventions.md │ │ ├── abstractions.ts │ │ ├── Accordion │ │ │ ├── Accordion.md │ │ │ ├── Accordion.module.scss │ │ │ ├── Accordion.spec.ts │ │ │ ├── Accordion.tsx │ │ │ ├── AccordionContext.tsx │ │ │ ├── AccordionItem.tsx │ │ │ ├── AccordionItemNative.tsx │ │ │ └── AccordionNative.tsx │ │ ├── Animation │ │ │ └── AnimationNative.tsx │ │ ├── APICall │ │ │ ├── APICall.md │ │ │ ├── APICall.spec.ts │ │ │ ├── APICall.tsx │ │ │ └── APICallNative.tsx │ │ ├── App │ │ │ ├── App.md │ │ │ ├── App.module.scss │ │ │ ├── App.spec.ts │ │ │ ├── App.tsx │ │ │ ├── AppLayoutContext.ts │ │ │ ├── AppNative.tsx │ │ │ ├── AppStateContext.ts │ │ │ ├── doc-resources │ │ │ │ ├── condensed-sticky.xmlui │ │ │ │ ├── condensed.xmlui │ │ │ │ ├── horizontal-sticky.xmlui │ │ │ │ ├── horizontal.xmlui │ │ │ │ ├── vertical-full-header.xmlui │ │ │ │ ├── vertical-sticky.xmlui │ │ │ │ └── vertical.xmlui │ │ │ ├── IndexerContext.ts │ │ │ ├── LinkInfoContext.ts │ │ │ ├── SearchContext.tsx │ │ │ ├── Sheet.module.scss │ │ │ └── Sheet.tsx │ │ ├── AppHeader │ │ │ ├── AppHeader.md │ │ │ ├── AppHeader.module.scss │ │ │ ├── AppHeader.spec.ts │ │ │ ├── AppHeader.tsx │ │ │ └── AppHeaderNative.tsx │ │ ├── AppState │ │ │ ├── AppState.md │ │ │ ├── AppState.spec.ts │ │ │ ├── AppState.tsx │ │ │ └── AppStateNative.tsx │ │ ├── AutoComplete │ │ │ ├── AutoComplete.md │ │ │ ├── AutoComplete.module.scss │ │ │ ├── AutoComplete.spec.ts │ │ │ ├── AutoComplete.tsx │ │ │ ├── AutoCompleteContext.tsx │ │ │ └── AutoCompleteNative.tsx │ │ ├── Avatar │ │ │ ├── Avatar.md │ │ │ ├── Avatar.module.scss │ │ │ ├── Avatar.spec.ts │ │ │ ├── Avatar.tsx │ │ │ └── AvatarNative.tsx │ │ ├── Backdrop │ │ │ ├── Backdrop.md │ │ │ ├── Backdrop.module.scss │ │ │ ├── Backdrop.spec.ts │ │ │ ├── Backdrop.tsx │ │ │ └── BackdropNative.tsx │ │ ├── Badge │ │ │ ├── Badge.md │ │ │ ├── Badge.module.scss │ │ │ ├── Badge.spec.ts │ │ │ ├── Badge.tsx │ │ │ └── BadgeNative.tsx │ │ ├── Bookmark │ │ │ ├── Bookmark.md │ │ │ ├── Bookmark.module.scss │ │ │ ├── Bookmark.spec.ts │ │ │ ├── Bookmark.tsx │ │ │ └── BookmarkNative.tsx │ │ ├── Breakout │ │ │ ├── Breakout.module.scss │ │ │ ├── Breakout.spec.ts │ │ │ ├── Breakout.tsx │ │ │ └── BreakoutNative.tsx │ │ ├── Button │ │ │ ├── Button-style.spec.ts │ │ │ ├── Button.md │ │ │ ├── Button.module.scss │ │ │ ├── Button.spec.ts │ │ │ ├── Button.tsx │ │ │ └── ButtonNative.tsx │ │ ├── Card │ │ │ ├── Card.md │ │ │ ├── Card.module.scss │ │ │ ├── Card.spec.ts │ │ │ ├── Card.tsx │ │ │ └── CardNative.tsx │ │ ├── Carousel │ │ │ ├── Carousel.md │ │ │ ├── Carousel.module.scss │ │ │ ├── Carousel.spec.ts │ │ │ ├── Carousel.tsx │ │ │ ├── CarouselContext.tsx │ │ │ ├── CarouselItem.tsx │ │ │ ├── CarouselItemNative.tsx │ │ │ └── CarouselNative.tsx │ │ ├── ChangeListener │ │ │ ├── ChangeListener.md │ │ │ ├── ChangeListener.spec.ts │ │ │ ├── ChangeListener.tsx │ │ │ └── ChangeListenerNative.tsx │ │ ├── chart-color-schemes.ts │ │ ├── Charts │ │ │ ├── AreaChart │ │ │ │ ├── AreaChart.md │ │ │ │ ├── AreaChart.spec.ts │ │ │ │ ├── AreaChart.tsx │ │ │ │ └── AreaChartNative.tsx │ │ │ ├── BarChart │ │ │ │ ├── BarChart.md │ │ │ │ ├── BarChart.module.scss │ │ │ │ ├── BarChart.spec.ts │ │ │ │ ├── BarChart.tsx │ │ │ │ └── BarChartNative.tsx │ │ │ ├── DonutChart │ │ │ │ ├── DonutChart.spec.ts │ │ │ │ └── DonutChart.tsx │ │ │ ├── LabelList │ │ │ │ ├── LabelList.spec.ts │ │ │ │ ├── LabelList.tsx │ │ │ │ ├── LabelListNative.module.scss │ │ │ │ └── LabelListNative.tsx │ │ │ ├── Legend │ │ │ │ ├── Legend.spec.ts │ │ │ │ ├── Legend.tsx │ │ │ │ └── LegendNative.tsx │ │ │ ├── LineChart │ │ │ │ ├── LineChart.md │ │ │ │ ├── LineChart.module.scss │ │ │ │ ├── LineChart.spec.ts │ │ │ │ ├── LineChart.tsx │ │ │ │ └── LineChartNative.tsx │ │ │ ├── PieChart │ │ │ │ ├── PieChart.md │ │ │ │ ├── PieChart.spec.ts │ │ │ │ ├── PieChart.tsx │ │ │ │ ├── PieChartNative.module.scss │ │ │ │ └── PieChartNative.tsx │ │ │ ├── RadarChart │ │ │ │ ├── RadarChart.md │ │ │ │ ├── RadarChart.spec.ts │ │ │ │ ├── RadarChart.tsx │ │ │ │ └── RadarChartNative.tsx │ │ │ ├── Tooltip │ │ │ │ ├── TooltipContent.module.scss │ │ │ │ ├── TooltipContent.spec.ts │ │ │ │ └── TooltipContent.tsx │ │ │ └── utils │ │ │ ├── abstractions.ts │ │ │ └── ChartProvider.tsx │ │ ├── Checkbox │ │ │ ├── Checkbox.md │ │ │ ├── Checkbox.spec.ts │ │ │ └── Checkbox.tsx │ │ ├── CodeBlock │ │ │ ├── CodeBlock.module.scss │ │ │ ├── CodeBlock.spec.ts │ │ │ ├── CodeBlock.tsx │ │ │ ├── CodeBlockNative.tsx │ │ │ └── highlight-code.ts │ │ ├── collectedComponentMetadata.ts │ │ ├── ColorPicker │ │ │ ├── ColorPicker.md │ │ │ ├── ColorPicker.module.scss │ │ │ ├── ColorPicker.spec.ts │ │ │ ├── ColorPicker.tsx │ │ │ └── ColorPickerNative.tsx │ │ ├── Column │ │ │ ├── Column.md │ │ │ ├── Column.tsx │ │ │ ├── ColumnNative.tsx │ │ │ ├── doc-resources │ │ │ │ └── list-component-data.js │ │ │ └── TableContext.tsx │ │ ├── component-utils.ts │ │ ├── ComponentProvider.tsx │ │ ├── ComponentRegistryContext.tsx │ │ ├── container-helpers.tsx │ │ ├── ContentSeparator │ │ │ ├── ContentSeparator.md │ │ │ ├── ContentSeparator.module.scss │ │ │ ├── ContentSeparator.spec.ts │ │ │ ├── ContentSeparator.tsx │ │ │ └── ContentSeparatorNative.tsx │ │ ├── DataSource │ │ │ ├── DataSource.md │ │ │ └── DataSource.tsx │ │ ├── DateInput │ │ │ ├── DateInput.md │ │ │ ├── DateInput.module.scss │ │ │ ├── DateInput.spec.ts │ │ │ ├── DateInput.tsx │ │ │ └── DateInputNative.tsx │ │ ├── DatePicker │ │ │ ├── DatePicker.md │ │ │ ├── DatePicker.module.scss │ │ │ ├── DatePicker.spec.ts │ │ │ ├── DatePicker.tsx │ │ │ └── DatePickerNative.tsx │ │ ├── DropdownMenu │ │ │ ├── DropdownMenu.md │ │ │ ├── DropdownMenu.module.scss │ │ │ ├── DropdownMenu.spec.ts │ │ │ ├── DropdownMenu.tsx │ │ │ ├── DropdownMenuNative.tsx │ │ │ ├── MenuItem.md │ │ │ └── SubMenuItem.md │ │ ├── EmojiSelector │ │ │ ├── EmojiSelector.md │ │ │ ├── EmojiSelector.spec.ts │ │ │ ├── EmojiSelector.tsx │ │ │ └── EmojiSelectorNative.tsx │ │ ├── ExpandableItem │ │ │ ├── ExpandableItem.module.scss │ │ │ ├── ExpandableItem.spec.ts │ │ │ ├── ExpandableItem.tsx │ │ │ └── ExpandableItemNative.tsx │ │ ├── FileInput │ │ │ ├── FileInput.md │ │ │ ├── FileInput.module.scss │ │ │ ├── FileInput.spec.ts │ │ │ ├── FileInput.tsx │ │ │ └── FileInputNative.tsx │ │ ├── FileUploadDropZone │ │ │ ├── FileUploadDropZone.md │ │ │ ├── FileUploadDropZone.module.scss │ │ │ ├── FileUploadDropZone.spec.ts │ │ │ ├── FileUploadDropZone.tsx │ │ │ └── FileUploadDropZoneNative.tsx │ │ ├── FlowLayout │ │ │ ├── FlowLayout.md │ │ │ ├── FlowLayout.module.scss │ │ │ ├── FlowLayout.spec.ts │ │ │ ├── FlowLayout.spec.ts-snapshots │ │ │ │ └── Edge-cases-boxShadow-is-not-clipped-1-non-smoke-darwin.png │ │ │ ├── FlowLayout.tsx │ │ │ └── FlowLayoutNative.tsx │ │ ├── Footer │ │ │ ├── Footer.md │ │ │ ├── Footer.module.scss │ │ │ ├── Footer.spec.ts │ │ │ ├── Footer.tsx │ │ │ └── FooterNative.tsx │ │ ├── Form │ │ │ ├── Form.md │ │ │ ├── Form.module.scss │ │ │ ├── Form.spec.ts │ │ │ ├── Form.tsx │ │ │ ├── formActions.ts │ │ │ ├── FormContext.ts │ │ │ └── FormNative.tsx │ │ ├── FormItem │ │ │ ├── FormItem.md │ │ │ ├── FormItem.module.scss │ │ │ ├── FormItem.spec.ts │ │ │ ├── FormItem.tsx │ │ │ ├── FormItemNative.tsx │ │ │ ├── HelperText.module.scss │ │ │ ├── HelperText.tsx │ │ │ ├── ItemWithLabel.tsx │ │ │ └── Validations.ts │ │ ├── FormSection │ │ │ ├── FormSection.md │ │ │ ├── FormSection.ts │ │ │ └── FormSection.xmlui │ │ ├── Fragment │ │ │ ├── Fragment.spec.ts │ │ │ └── Fragment.tsx │ │ ├── Heading │ │ │ ├── abstractions.ts │ │ │ ├── H1.md │ │ │ ├── H1.spec.ts │ │ │ ├── H2.md │ │ │ ├── H2.spec.ts │ │ │ ├── H3.md │ │ │ ├── H3.spec.ts │ │ │ ├── H4.md │ │ │ ├── H4.spec.ts │ │ │ ├── H5.md │ │ │ ├── H5.spec.ts │ │ │ ├── H6.md │ │ │ ├── H6.spec.ts │ │ │ ├── Heading.md │ │ │ ├── Heading.module.scss │ │ │ ├── Heading.spec.ts │ │ │ ├── Heading.tsx │ │ │ └── HeadingNative.tsx │ │ ├── HoverCard │ │ │ ├── HoverCard.tsx │ │ │ └── HovercardNative.tsx │ │ ├── HtmlTags │ │ │ ├── HtmlTags.module.scss │ │ │ ├── HtmlTags.spec.ts │ │ │ └── HtmlTags.tsx │ │ ├── Icon │ │ │ ├── AdmonitionDanger.tsx │ │ │ ├── AdmonitionInfo.tsx │ │ │ ├── AdmonitionNote.tsx │ │ │ ├── AdmonitionTip.tsx │ │ │ ├── AdmonitionWarning.tsx │ │ │ ├── ApiIcon.tsx │ │ │ ├── ArrowDropDown.module.scss │ │ │ ├── ArrowDropDown.tsx │ │ │ ├── ArrowDropUp.module.scss │ │ │ ├── ArrowDropUp.tsx │ │ │ ├── ArrowLeft.module.scss │ │ │ ├── ArrowLeft.tsx │ │ │ ├── ArrowRight.module.scss │ │ │ ├── ArrowRight.tsx │ │ │ ├── Attach.tsx │ │ │ ├── Binding.module.scss │ │ │ ├── Binding.tsx │ │ │ ├── BoardIcon.tsx │ │ │ ├── BoxIcon.tsx │ │ │ ├── CheckIcon.tsx │ │ │ ├── ChevronDownIcon.tsx │ │ │ ├── ChevronLeft.tsx │ │ │ ├── ChevronRight.tsx │ │ │ ├── ChevronUpIcon.tsx │ │ │ ├── CodeFileIcon.tsx │ │ │ ├── CodeSandbox.tsx │ │ │ ├── CompactListIcon.tsx │ │ │ ├── ContentCopyIcon.tsx │ │ │ ├── DarkToLightIcon.tsx │ │ │ ├── DatabaseIcon.module.scss │ │ │ ├── DatabaseIcon.tsx │ │ │ ├── DocFileIcon.tsx │ │ │ ├── DocIcon.tsx │ │ │ ├── DotMenuHorizontalIcon.tsx │ │ │ ├── DotMenuIcon.tsx │ │ │ ├── EmailIcon.tsx │ │ │ ├── EmptyFolderIcon.tsx │ │ │ ├── ErrorIcon.tsx │ │ │ ├── ExpressionIcon.tsx │ │ │ ├── FillPlusCricleIcon.tsx │ │ │ ├── FilterIcon.tsx │ │ │ ├── FolderIcon.tsx │ │ │ ├── GlobeIcon.tsx │ │ │ ├── HomeIcon.tsx │ │ │ ├── HyperLinkIcon.tsx │ │ │ ├── Icon.md │ │ │ ├── Icon.module.scss │ │ │ ├── Icon.spec.ts │ │ │ ├── Icon.tsx │ │ │ ├── IconNative.tsx │ │ │ ├── ImageFileIcon.tsx │ │ │ ├── Inspect.tsx │ │ │ ├── LightToDark.tsx │ │ │ ├── LinkIcon.tsx │ │ │ ├── ListIcon.tsx │ │ │ ├── LooseListIcon.tsx │ │ │ ├── MoonIcon.tsx │ │ │ ├── MoreOptionsIcon.tsx │ │ │ ├── NoSortIcon.tsx │ │ │ ├── PDFIcon.tsx │ │ │ ├── PenIcon.tsx │ │ │ ├── PhoneIcon.tsx │ │ │ ├── PhotoIcon.tsx │ │ │ ├── PlusIcon.tsx │ │ │ ├── SearchIcon.tsx │ │ │ ├── ShareIcon.tsx │ │ │ ├── SortAscendingIcon.tsx │ │ │ ├── SortDescendingIcon.tsx │ │ │ ├── StarsIcon.tsx │ │ │ ├── SunIcon.tsx │ │ │ ├── svg │ │ │ │ ├── admonition_danger.svg │ │ │ │ ├── admonition_info.svg │ │ │ │ ├── admonition_note.svg │ │ │ │ ├── admonition_tip.svg │ │ │ │ ├── admonition_warning.svg │ │ │ │ ├── api.svg │ │ │ │ ├── arrow-dropdown.svg │ │ │ │ ├── arrow-left.svg │ │ │ │ ├── arrow-right.svg │ │ │ │ ├── arrow-up.svg │ │ │ │ ├── attach.svg │ │ │ │ ├── binding.svg │ │ │ │ ├── box.svg │ │ │ │ ├── bulb.svg │ │ │ │ ├── code-file.svg │ │ │ │ ├── code-sandbox.svg │ │ │ │ ├── dark_to_light.svg │ │ │ │ ├── database.svg │ │ │ │ ├── doc.svg │ │ │ │ ├── empty-folder.svg │ │ │ │ ├── expression.svg │ │ │ │ ├── eye-closed.svg │ │ │ │ ├── eye-dark.svg │ │ │ │ ├── eye.svg │ │ │ │ ├── file-text.svg │ │ │ │ ├── filter.svg │ │ │ │ ├── folder.svg │ │ │ │ ├── img.svg │ │ │ │ ├── inspect.svg │ │ │ │ ├── light_to_dark.svg │ │ │ │ ├── moon.svg │ │ │ │ ├── pdf.svg │ │ │ │ ├── photo.svg │ │ │ │ ├── share.svg │ │ │ │ ├── stars.svg │ │ │ │ ├── sun.svg │ │ │ │ ├── trending-down.svg │ │ │ │ ├── trending-level.svg │ │ │ │ ├── trending-up.svg │ │ │ │ ├── txt.svg │ │ │ │ ├── unknown-file.svg │ │ │ │ ├── unlink.svg │ │ │ │ └── xls.svg │ │ │ ├── TableDeleteColumnIcon.tsx │ │ │ ├── TableDeleteRowIcon.tsx │ │ │ ├── TableInsertColumnIcon.tsx │ │ │ ├── TableInsertRowIcon.tsx │ │ │ ├── TrashIcon.tsx │ │ │ ├── TrendingDownIcon.tsx │ │ │ ├── TrendingLevelIcon.tsx │ │ │ ├── TrendingUpIcon.tsx │ │ │ ├── TxtIcon.tsx │ │ │ ├── UnknownFileIcon.tsx │ │ │ ├── UnlinkIcon.tsx │ │ │ ├── UserIcon.tsx │ │ │ ├── WarningIcon.tsx │ │ │ └── XlsIcon.tsx │ │ ├── IconProvider.tsx │ │ ├── IconRegistryContext.tsx │ │ ├── IFrame │ │ │ ├── IFrame.md │ │ │ ├── IFrame.module.scss │ │ │ ├── IFrame.spec.ts │ │ │ ├── IFrame.tsx │ │ │ └── IFrameNative.tsx │ │ ├── Image │ │ │ ├── Image.md │ │ │ ├── Image.module.scss │ │ │ ├── Image.spec.ts │ │ │ ├── Image.tsx │ │ │ └── ImageNative.tsx │ │ ├── Input │ │ │ ├── index.ts │ │ │ ├── InputAdornment.module.scss │ │ │ ├── InputAdornment.tsx │ │ │ ├── InputDivider.module.scss │ │ │ ├── InputDivider.tsx │ │ │ ├── InputLabel.module.scss │ │ │ ├── InputLabel.tsx │ │ │ ├── PartialInput.module.scss │ │ │ └── PartialInput.tsx │ │ ├── InspectButton │ │ │ ├── InspectButton.module.scss │ │ │ └── InspectButton.tsx │ │ ├── Items │ │ │ ├── Items.md │ │ │ ├── Items.spec.ts │ │ │ ├── Items.tsx │ │ │ └── ItemsNative.tsx │ │ ├── Link │ │ │ ├── Link.md │ │ │ ├── Link.module.scss │ │ │ ├── Link.spec.ts │ │ │ ├── Link.tsx │ │ │ └── LinkNative.tsx │ │ ├── List │ │ │ ├── doc-resources │ │ │ │ └── list-component-data.js │ │ │ ├── List.md │ │ │ ├── List.module.scss │ │ │ ├── List.spec.ts │ │ │ ├── List.tsx │ │ │ └── ListNative.tsx │ │ ├── Logo │ │ │ ├── doc-resources │ │ │ │ └── xmlui-logo.svg │ │ │ ├── Logo.md │ │ │ ├── Logo.tsx │ │ │ └── LogoNative.tsx │ │ ├── Markdown │ │ │ ├── CodeText.module.scss │ │ │ ├── CodeText.tsx │ │ │ ├── Markdown.md │ │ │ ├── Markdown.module.scss │ │ │ ├── Markdown.spec.ts │ │ │ ├── Markdown.tsx │ │ │ ├── MarkdownNative.tsx │ │ │ ├── parse-binding-expr.ts │ │ │ └── utils.ts │ │ ├── metadata-helpers.ts │ │ ├── ModalDialog │ │ │ ├── ConfirmationModalContextProvider.tsx │ │ │ ├── Dialog.module.scss │ │ │ ├── Dialog.tsx │ │ │ ├── ModalDialog.md │ │ │ ├── ModalDialog.module.scss │ │ │ ├── ModalDialog.spec.ts │ │ │ ├── ModalDialog.tsx │ │ │ ├── ModalDialogNative.tsx │ │ │ └── ModalVisibilityContext.tsx │ │ ├── NavGroup │ │ │ ├── NavGroup.md │ │ │ ├── NavGroup.module.scss │ │ │ ├── NavGroup.spec.ts │ │ │ ├── NavGroup.tsx │ │ │ ├── NavGroupContext.ts │ │ │ └── NavGroupNative.tsx │ │ ├── NavLink │ │ │ ├── NavLink.md │ │ │ ├── NavLink.module.scss │ │ │ ├── NavLink.spec.ts │ │ │ ├── NavLink.tsx │ │ │ └── NavLinkNative.tsx │ │ ├── NavPanel │ │ │ ├── NavPanel.md │ │ │ ├── NavPanel.module.scss │ │ │ ├── NavPanel.spec.ts │ │ │ ├── NavPanel.tsx │ │ │ └── NavPanelNative.tsx │ │ ├── NestedApp │ │ │ ├── AppWithCodeView.module.scss │ │ │ ├── AppWithCodeView.tsx │ │ │ ├── AppWithCodeViewNative.tsx │ │ │ ├── defaultProps.tsx │ │ │ ├── logo.svg │ │ │ ├── NestedApp.module.scss │ │ │ ├── NestedApp.tsx │ │ │ ├── NestedAppNative.tsx │ │ │ ├── Tooltip.module.scss │ │ │ ├── Tooltip.tsx │ │ │ └── utils.ts │ │ ├── NoResult │ │ │ ├── NoResult.md │ │ │ ├── NoResult.module.scss │ │ │ ├── NoResult.spec.ts │ │ │ ├── NoResult.tsx │ │ │ └── NoResultNative.tsx │ │ ├── NumberBox │ │ │ ├── numberbox-abstractions.ts │ │ │ ├── NumberBox.md │ │ │ ├── NumberBox.module.scss │ │ │ ├── NumberBox.spec.ts │ │ │ ├── NumberBox.tsx │ │ │ └── NumberBoxNative.tsx │ │ ├── Option │ │ │ ├── Option.md │ │ │ ├── Option.spec.ts │ │ │ ├── Option.tsx │ │ │ ├── OptionNative.tsx │ │ │ └── OptionTypeProvider.tsx │ │ ├── PageMetaTitle │ │ │ ├── PageMetaTilteNative.tsx │ │ │ ├── PageMetaTitle.md │ │ │ ├── PageMetaTitle.spec.ts │ │ │ └── PageMetaTitle.tsx │ │ ├── Pages │ │ │ ├── Page.md │ │ │ ├── Pages.md │ │ │ ├── Pages.module.scss │ │ │ ├── Pages.tsx │ │ │ └── PagesNative.tsx │ │ ├── Pagination │ │ │ ├── Pagination.md │ │ │ ├── Pagination.module.scss │ │ │ ├── Pagination.spec.ts │ │ │ ├── Pagination.tsx │ │ │ └── PaginationNative.tsx │ │ ├── PositionedContainer │ │ │ ├── PositionedContainer.module.scss │ │ │ ├── PositionedContainer.tsx │ │ │ └── PositionedContainerNative.tsx │ │ ├── ProfileMenu │ │ │ ├── ProfileMenu.module.scss │ │ │ └── ProfileMenu.tsx │ │ ├── ProgressBar │ │ │ ├── ProgressBar.md │ │ │ ├── ProgressBar.module.scss │ │ │ ├── ProgressBar.spec.ts │ │ │ ├── ProgressBar.tsx │ │ │ └── ProgressBarNative.tsx │ │ ├── Queue │ │ │ ├── Queue.md │ │ │ ├── Queue.spec.ts │ │ │ ├── Queue.tsx │ │ │ ├── queueActions.ts │ │ │ └── QueueNative.tsx │ │ ├── RadioGroup │ │ │ ├── RadioGroup.md │ │ │ ├── RadioGroup.module.scss │ │ │ ├── RadioGroup.spec.ts │ │ │ ├── RadioGroup.tsx │ │ │ ├── RadioGroupNative.tsx │ │ │ ├── RadioItem.tsx │ │ │ └── RadioItemNative.tsx │ │ ├── RealTimeAdapter │ │ │ ├── RealTimeAdapter.tsx │ │ │ └── RealTimeAdapterNative.tsx │ │ ├── Redirect │ │ │ ├── Redirect.md │ │ │ ├── Redirect.spec.ts │ │ │ └── Redirect.tsx │ │ ├── ResponsiveBar │ │ │ ├── README.md │ │ │ ├── ResponsiveBar.md │ │ │ ├── ResponsiveBar.module.scss │ │ │ ├── ResponsiveBar.spec.ts │ │ │ ├── ResponsiveBar.tsx │ │ │ └── ResponsiveBarNative.tsx │ │ ├── Select │ │ │ ├── HiddenOption.tsx │ │ │ ├── MultiSelectOption.tsx │ │ │ ├── OptionContext.ts │ │ │ ├── Select.md │ │ │ ├── Select.module.scss │ │ │ ├── Select.spec.ts │ │ │ ├── Select.tsx │ │ │ ├── SelectContext.tsx │ │ │ ├── SelectNative.tsx │ │ │ ├── SelectOption.tsx │ │ │ └── SimpleSelect.tsx │ │ ├── SelectionStore │ │ │ ├── SelectionStore.md │ │ │ ├── SelectionStore.tsx │ │ │ └── SelectionStoreNative.tsx │ │ ├── Slider │ │ │ ├── Slider.md │ │ │ ├── Slider.module.scss │ │ │ ├── Slider.spec.ts │ │ │ ├── Slider.tsx │ │ │ └── SliderNative.tsx │ │ ├── Slot │ │ │ ├── Slot.md │ │ │ ├── Slot.spec.ts │ │ │ └── Slot.ts │ │ ├── SlotItem.tsx │ │ ├── SpaceFiller │ │ │ ├── SpaceFiller.md │ │ │ ├── SpaceFiller.module.scss │ │ │ ├── SpaceFiller.spec.ts │ │ │ ├── SpaceFiller.tsx │ │ │ └── SpaceFillerNative.tsx │ │ ├── Spinner │ │ │ ├── Spinner.md │ │ │ ├── Spinner.module.scss │ │ │ ├── Spinner.spec.ts │ │ │ ├── Spinner.tsx │ │ │ └── SpinnerNative.tsx │ │ ├── Splitter │ │ │ ├── HSplitter.md │ │ │ ├── HSplitter.spec.ts │ │ │ ├── Splitter.md │ │ │ ├── Splitter.module.scss │ │ │ ├── Splitter.spec.ts │ │ │ ├── Splitter.tsx │ │ │ ├── SplitterNative.tsx │ │ │ ├── utils.ts │ │ │ ├── VSplitter.md │ │ │ └── VSplitter.spec.ts │ │ ├── Stack │ │ │ ├── CHStack.md │ │ │ ├── CHStack.spec.ts │ │ │ ├── CVStack.md │ │ │ ├── CVStack.spec.ts │ │ │ ├── HStack.md │ │ │ ├── HStack.spec.ts │ │ │ ├── Stack.md │ │ │ ├── Stack.module.scss │ │ │ ├── Stack.spec.ts │ │ │ ├── Stack.tsx │ │ │ ├── StackNative.tsx │ │ │ ├── VStack.md │ │ │ └── VStack.spec.ts │ │ ├── StickyBox │ │ │ ├── StickyBox.md │ │ │ ├── StickyBox.module.scss │ │ │ ├── StickyBox.tsx │ │ │ └── StickyBoxNative.tsx │ │ ├── Switch │ │ │ ├── Switch.md │ │ │ ├── Switch.spec.ts │ │ │ └── Switch.tsx │ │ ├── Table │ │ │ ├── doc-resources │ │ │ │ └── list-component-data.js │ │ │ ├── react-table-config.d.ts │ │ │ ├── Table.md │ │ │ ├── Table.module.scss │ │ │ ├── Table.spec.ts │ │ │ ├── Table.tsx │ │ │ ├── TableNative.tsx │ │ │ └── useRowSelection.tsx │ │ ├── TableOfContents │ │ │ ├── TableOfContents.module.scss │ │ │ ├── TableOfContents.spec.ts │ │ │ ├── TableOfContents.tsx │ │ │ └── TableOfContentsNative.tsx │ │ ├── Tabs │ │ │ ├── TabContext.tsx │ │ │ ├── TabItem.md │ │ │ ├── TabItem.tsx │ │ │ ├── TabItemNative.tsx │ │ │ ├── Tabs.md │ │ │ ├── Tabs.module.scss │ │ │ ├── Tabs.spec.ts │ │ │ ├── Tabs.tsx │ │ │ └── TabsNative.tsx │ │ ├── Text │ │ │ ├── Text.md │ │ │ ├── Text.module.scss │ │ │ ├── Text.spec.ts │ │ │ ├── Text.tsx │ │ │ └── TextNative.tsx │ │ ├── TextArea │ │ │ ├── TextArea.md │ │ │ ├── TextArea.module.scss │ │ │ ├── TextArea.spec.ts │ │ │ ├── TextArea.tsx │ │ │ ├── TextAreaNative.tsx │ │ │ ├── TextAreaResizable.tsx │ │ │ └── useComposedRef.ts │ │ ├── TextBox │ │ │ ├── TextBox.md │ │ │ ├── TextBox.module.scss │ │ │ ├── TextBox.spec.ts │ │ │ ├── TextBox.tsx │ │ │ └── TextBoxNative.tsx │ │ ├── Theme │ │ │ ├── NotificationToast.tsx │ │ │ ├── Theme.md │ │ │ ├── Theme.module.scss │ │ │ ├── Theme.spec.ts │ │ │ ├── Theme.tsx │ │ │ └── ThemeNative.tsx │ │ ├── TimeInput │ │ │ ├── TimeInput.md │ │ │ ├── TimeInput.module.scss │ │ │ ├── TimeInput.spec.ts │ │ │ ├── TimeInput.tsx │ │ │ ├── TimeInputNative.tsx │ │ │ └── utils.ts │ │ ├── Timer │ │ │ ├── Timer.md │ │ │ ├── Timer.spec.ts │ │ │ ├── Timer.tsx │ │ │ └── TimerNative.tsx │ │ ├── Toggle │ │ │ ├── Toggle.module.scss │ │ │ └── Toggle.tsx │ │ ├── ToneChangerButton │ │ │ ├── ToneChangerButton.md │ │ │ ├── ToneChangerButton.spec.ts │ │ │ └── ToneChangerButton.tsx │ │ ├── ToneSwitch │ │ │ ├── ToneSwitch.md │ │ │ ├── ToneSwitch.module.scss │ │ │ ├── ToneSwitch.spec.ts │ │ │ ├── ToneSwitch.tsx │ │ │ └── ToneSwitchNative.tsx │ │ ├── Tooltip │ │ │ ├── Tooltip.md │ │ │ ├── Tooltip.module.scss │ │ │ ├── Tooltip.spec.ts │ │ │ ├── Tooltip.tsx │ │ │ └── TooltipNative.tsx │ │ ├── Tree │ │ │ ├── testData.ts │ │ │ ├── Tree-dynamic.spec.ts │ │ │ ├── Tree-icons.spec.ts │ │ │ ├── Tree.md │ │ │ ├── Tree.spec.ts │ │ │ ├── TreeComponent.module.scss │ │ │ ├── TreeComponent.tsx │ │ │ └── TreeNative.tsx │ │ ├── TreeDisplay │ │ │ ├── TreeDisplay.md │ │ │ ├── TreeDisplay.module.scss │ │ │ ├── TreeDisplay.tsx │ │ │ └── TreeDisplayNative.tsx │ │ ├── ValidationSummary │ │ │ ├── ValidationSummary.module.scss │ │ │ └── ValidationSummary.tsx │ │ └── VisuallyHidden.tsx │ ├── components-core │ │ ├── abstractions │ │ │ ├── ComponentRenderer.ts │ │ │ ├── LoaderRenderer.ts │ │ │ ├── standalone.ts │ │ │ └── treeAbstractions.ts │ │ ├── action │ │ │ ├── actions.ts │ │ │ ├── APICall.tsx │ │ │ ├── FileDownloadAction.tsx │ │ │ ├── FileUploadAction.tsx │ │ │ ├── NavigateAction.tsx │ │ │ └── TimedAction.tsx │ │ ├── ApiBoundComponent.tsx │ │ ├── appContext │ │ │ ├── date-functions.ts │ │ │ ├── math-function.ts │ │ │ └── misc-utils.ts │ │ ├── AppContext.tsx │ │ ├── behaviors │ │ │ ├── Behavior.tsx │ │ │ ├── BehaviorContext.tsx │ │ │ └── CoreBehaviors.tsx │ │ ├── component-hooks.ts │ │ ├── ComponentDecorator.tsx │ │ ├── ComponentViewer.tsx │ │ ├── CompoundComponent.tsx │ │ ├── constants.ts │ │ ├── DebugViewProvider.tsx │ │ ├── descriptorHelper.ts │ │ ├── devtools │ │ │ ├── InspectorDialog.module.scss │ │ │ ├── InspectorDialog.tsx │ │ │ └── InspectorDialogVisibilityContext.tsx │ │ ├── EngineError.ts │ │ ├── event-handlers.ts │ │ ├── InspectorButton.module.scss │ │ ├── InspectorContext.tsx │ │ ├── interception │ │ │ ├── abstractions.ts │ │ │ ├── ApiInterceptor.ts │ │ │ ├── ApiInterceptorProvider.tsx │ │ │ ├── apiInterceptorWorker.ts │ │ │ ├── Backend.ts │ │ │ ├── Errors.ts │ │ │ ├── IndexedDb.ts │ │ │ ├── initMock.ts │ │ │ ├── InMemoryDb.ts │ │ │ ├── ReadonlyCollection.ts │ │ │ └── useApiInterceptorContext.tsx │ │ ├── loader │ │ │ ├── ApiLoader.tsx │ │ │ ├── DataLoader.tsx │ │ │ ├── ExternalDataLoader.tsx │ │ │ ├── Loader.tsx │ │ │ ├── MockLoaderRenderer.tsx │ │ │ └── PageableLoader.tsx │ │ ├── LoaderComponent.tsx │ │ ├── markup-check.ts │ │ ├── parts.ts │ │ ├── renderers.ts │ │ ├── rendering │ │ │ ├── AppContent.tsx │ │ │ ├── AppRoot.tsx │ │ │ ├── AppWrapper.tsx │ │ │ ├── buildProxy.ts │ │ │ ├── collectFnVarDeps.ts │ │ │ ├── ComponentAdapter.tsx │ │ │ ├── ComponentWrapper.tsx │ │ │ ├── Container.tsx │ │ │ ├── containers.ts │ │ │ ├── ContainerWrapper.tsx │ │ │ ├── ErrorBoundary.module.scss │ │ │ ├── ErrorBoundary.tsx │ │ │ ├── InvalidComponent.module.scss │ │ │ ├── InvalidComponent.tsx │ │ │ ├── nodeUtils.ts │ │ │ ├── reducer.ts │ │ │ ├── renderChild.tsx │ │ │ ├── StandaloneComponent.tsx │ │ │ ├── StateContainer.tsx │ │ │ ├── UnknownComponent.module.scss │ │ │ ├── UnknownComponent.tsx │ │ │ └── valueExtractor.ts │ │ ├── reportEngineError.ts │ │ ├── RestApiProxy.ts │ │ ├── script-runner │ │ │ ├── asyncProxy.ts │ │ │ ├── AttributeValueParser.ts │ │ │ ├── bannedFunctions.ts │ │ │ ├── BindingTreeEvaluationContext.ts │ │ │ ├── eval-tree-async.ts │ │ │ ├── eval-tree-common.ts │ │ │ ├── eval-tree-sync.ts │ │ │ ├── ParameterParser.ts │ │ │ ├── process-statement-async.ts │ │ │ ├── process-statement-common.ts │ │ │ ├── process-statement-sync.ts │ │ │ ├── ScriptingSourceTree.ts │ │ │ ├── simplify-expression.ts │ │ │ ├── statement-queue.ts │ │ │ └── visitors.ts │ │ ├── StandaloneApp.tsx │ │ ├── StandaloneExtensionManager.ts │ │ ├── TableOfContentsContext.tsx │ │ ├── theming │ │ │ ├── _themes.scss │ │ │ ├── component-layout-resolver.ts │ │ │ ├── extendThemeUtils.ts │ │ │ ├── hvar.ts │ │ │ ├── layout-resolver.ts │ │ │ ├── parse-layout-props.ts │ │ │ ├── StyleContext.tsx │ │ │ ├── StyleRegistry.ts │ │ │ ├── ThemeContext.tsx │ │ │ ├── ThemeProvider.tsx │ │ │ ├── themes │ │ │ │ ├── base-utils.ts │ │ │ │ ├── palette.ts │ │ │ │ ├── root.ts │ │ │ │ ├── solid.ts │ │ │ │ ├── theme-colors.ts │ │ │ │ └── xmlui.ts │ │ │ ├── themeVars.module.scss │ │ │ ├── themeVars.ts │ │ │ ├── transformThemeVars.ts │ │ │ └── utils.ts │ │ ├── utils │ │ │ ├── actionUtils.ts │ │ │ ├── audio-utils.ts │ │ │ ├── compound-utils.ts │ │ │ ├── css-utils.ts │ │ │ ├── DataLoaderQueryKeyGenerator.ts │ │ │ ├── date-utils.ts │ │ │ ├── extractParam.ts │ │ │ ├── hooks.tsx │ │ │ ├── LruCache.ts │ │ │ ├── mergeProps.ts │ │ │ ├── misc.ts │ │ │ ├── request-params.ts │ │ │ ├── statementUtils.ts │ │ │ └── treeUtils.ts │ │ └── xmlui-parser.ts │ ├── index-standalone.ts │ ├── index.scss │ ├── index.ts │ ├── language-server │ │ ├── server-common.ts │ │ ├── server-web-worker.ts │ │ ├── server.ts │ │ ├── services │ │ │ ├── common │ │ │ │ ├── docs-generation.ts │ │ │ │ ├── lsp-utils.ts │ │ │ │ ├── metadata-utils.ts │ │ │ │ └── syntax-node-utilities.ts │ │ │ ├── completion.ts │ │ │ ├── diagnostic.ts │ │ │ ├── format.ts │ │ │ └── hover.ts │ │ └── xmlui-metadata-generated.mjs │ ├── logging │ │ ├── LoggerContext.tsx │ │ ├── LoggerInitializer.tsx │ │ ├── LoggerService.ts │ │ └── xmlui.ts │ ├── logo.svg │ ├── parsers │ │ ├── common │ │ │ ├── GenericToken.ts │ │ │ ├── InputStream.ts │ │ │ └── utils.ts │ │ ├── scripting │ │ │ ├── code-behind-collect.ts │ │ │ ├── Lexer.ts │ │ │ ├── modules.ts │ │ │ ├── Parser.ts │ │ │ ├── ParserError.ts │ │ │ ├── ScriptingNodeTypes.ts │ │ │ ├── TokenTrait.ts │ │ │ ├── TokenType.ts │ │ │ └── tree-visitor.ts │ │ ├── style-parser │ │ │ ├── errors.ts │ │ │ ├── source-tree.ts │ │ │ ├── StyleInputStream.ts │ │ │ ├── StyleLexer.ts │ │ │ ├── StyleParser.ts │ │ │ └── tokens.ts │ │ └── xmlui-parser │ │ ├── CharacterCodes.ts │ │ ├── diagnostics.ts │ │ ├── fileExtensions.ts │ │ ├── index.ts │ │ ├── lint.ts │ │ ├── parser.ts │ │ ├── ParserError.ts │ │ ├── scanner.ts │ │ ├── syntax-kind.ts │ │ ├── syntax-node.ts │ │ ├── transform.ts │ │ ├── utils.ts │ │ ├── xmlui-serializer.ts │ │ └── xmlui-tree.ts │ ├── react-app-env.d.ts │ ├── syntax │ │ ├── monaco │ │ │ ├── grammar.monacoLanguage.ts │ │ │ ├── index.ts │ │ │ ├── xmlui-dark.ts │ │ │ ├── xmlui-light.ts │ │ │ └── xmluiscript.monacoLanguage.ts │ │ └── textMate │ │ ├── index.ts │ │ ├── xmlui-dark.json │ │ ├── xmlui-light.json │ │ ├── xmlui.json │ │ └── xmlui.tmLanguage.json │ ├── testing │ │ ├── assertions.ts │ │ ├── component-test-helpers.ts │ │ ├── ComponentDrivers.ts │ │ ├── drivers │ │ │ ├── DateInputDriver.ts │ │ │ ├── ModalDialogDriver.ts │ │ │ ├── NumberBoxDriver.ts │ │ │ ├── TextBoxDriver.ts │ │ │ ├── TimeInputDriver.ts │ │ │ ├── TimerDriver.ts │ │ │ └── TreeDriver.ts │ │ ├── fixtures.ts │ │ ├── infrastructure │ │ │ ├── index.html │ │ │ ├── main.tsx │ │ │ ├── public │ │ │ │ ├── mockServiceWorker.js │ │ │ │ ├── resources │ │ │ │ │ ├── bell.svg │ │ │ │ │ ├── box.svg │ │ │ │ │ ├── doc.svg │ │ │ │ │ ├── eye.svg │ │ │ │ │ ├── flower-640x480.jpg │ │ │ │ │ ├── sun.svg │ │ │ │ │ ├── test-image-100x100.jpg │ │ │ │ │ └── txt.svg │ │ │ │ └── serve.json │ │ │ └── TestBed.tsx │ │ └── themed-app-test-helpers.ts │ └── vite-env.d.ts ├── tests │ ├── components │ │ ├── CodeBlock │ │ │ └── hightlight-code.test.ts │ │ ├── playground-pattern.test.ts │ │ └── Tree │ │ └── Tree-states.test.ts │ ├── components-core │ │ ├── abstractions │ │ │ └── treeAbstractions.test.ts │ │ ├── container │ │ │ └── buildProxy.test.ts │ │ ├── interception │ │ │ ├── orderBy.test.ts │ │ │ ├── ReadOnlyCollection.test.ts │ │ │ └── request-param-converter.test.ts │ │ ├── scripts-runner │ │ │ ├── AttributeValueParser.test.ts │ │ │ ├── eval-tree-arrow-async.test.ts │ │ │ ├── eval-tree-arrow.test.ts │ │ │ ├── eval-tree-func-decl-async.test.ts │ │ │ ├── eval-tree-func-decl.test.ts │ │ │ ├── eval-tree-pre-post.test.ts │ │ │ ├── eval-tree-regression.test.ts │ │ │ ├── eval-tree.test.ts │ │ │ ├── function-proxy.test.ts │ │ │ ├── parser-regression.test.ts │ │ │ ├── process-event.test.ts │ │ │ ├── process-function.test.ts │ │ │ ├── process-implicit-context.test.ts │ │ │ ├── process-statement-asgn.test.ts │ │ │ ├── process-statement-destruct.test.ts │ │ │ ├── process-statement-regs.test.ts │ │ │ ├── process-statement-sync.test.ts │ │ │ ├── process-statement.test.ts │ │ │ ├── process-switch-sync.test.ts │ │ │ ├── process-switch.test.ts │ │ │ ├── process-try-sync.test.ts │ │ │ ├── process-try.test.ts │ │ │ └── test-helpers.ts │ │ ├── test-metadata-handler.ts │ │ ├── theming │ │ │ ├── border-segments.test.ts │ │ │ ├── component-layout.resolver.test.ts │ │ │ ├── layout-property-parser.test.ts │ │ │ ├── layout-resolver.test.ts │ │ │ ├── layout-resolver2.test.ts │ │ │ ├── layout-vp-override.test.ts │ │ │ └── padding-segments.test.ts │ │ └── utils │ │ ├── date-utils.test.ts │ │ ├── format-human-elapsed-time.test.ts │ │ └── LruCache.test.ts │ ├── language-server │ │ ├── completion.test.ts │ │ ├── format.test.ts │ │ ├── hover.test.ts │ │ └── mockData.ts │ └── parsers │ ├── common │ │ └── input-stream.test.ts │ ├── markdown │ │ └── parse-binding-expression.test.ts │ ├── parameter-parser.test.ts │ ├── paremeter-parser.test.ts │ ├── scripting │ │ ├── eval-tree-arrow.test.ts │ │ ├── eval-tree-pre-post.test.ts │ │ ├── eval-tree.test.ts │ │ ├── function-proxy.test.ts │ │ ├── lexer-literals.test.ts │ │ ├── lexer-misc.test.ts │ │ ├── module-parse.test.ts │ │ ├── parser-arrow.test.ts │ │ ├── parser-assignments.test.ts │ │ ├── parser-binary.test.ts │ │ ├── parser-destructuring.test.ts │ │ ├── parser-errors.test.ts │ │ ├── parser-expressions.test.ts │ │ ├── parser-function.test.ts │ │ ├── parser-literals.test.ts │ │ ├── parser-primary.test.ts │ │ ├── parser-regex.test.ts │ │ ├── parser-statements.test.ts │ │ ├── parser-unary.test.ts │ │ ├── process-event.test.ts │ │ ├── process-implicit-context.test.ts │ │ ├── process-statement-asgn.test.ts │ │ ├── process-statement-destruct.test.ts │ │ ├── process-statement-regs.test.ts │ │ ├── process-statement-sync.test.ts │ │ ├── process-statement.test.ts │ │ ├── process-switch-sync.test.ts │ │ ├── process-switch.test.ts │ │ ├── process-try-sync.test.ts │ │ ├── process-try.test.ts │ │ ├── simplify-expression.test.ts │ │ ├── statement-hooks.test.ts │ │ └── test-helpers.ts │ ├── style-parser │ │ ├── generateHvarChain.test.ts │ │ ├── parseHVar.test.ts │ │ ├── parser.test.ts │ │ └── tokens.test.ts │ └── xmlui │ ├── lint.test.ts │ ├── parser.test.ts │ ├── scanner.test.ts │ ├── transform.attr.test.ts │ ├── transform.circular.test.ts │ ├── transform.element.test.ts │ ├── transform.errors.test.ts │ ├── transform.escape.test.ts │ ├── transform.regression.test.ts │ ├── transform.script.test.ts │ ├── transform.test.ts │ └── xmlui.ts ├── tests-e2e │ ├── api-bound-component-regression.spec.ts │ ├── api-call-as-extracted-component.spec.ts │ ├── assign-to-object-or-array-regression.spec.ts │ ├── binding-regression.spec.ts │ ├── children-as-template-context-vars.spec.ts │ ├── compound-component.spec.ts │ ├── context-vars-regression.spec.ts │ ├── data-bindings.spec.ts │ ├── datasource-and-api-usage-in-var.spec.ts │ ├── datasource-direct-binding.spec.ts │ ├── datasource-onLoaded-regression.spec.ts │ ├── modify-array-item-regression.spec.ts │ ├── namespaces.spec.ts │ ├── push-to-array-regression.spec.ts │ ├── screen-breakpoints.spec.ts │ ├── scripting.spec.ts │ ├── state-scope-in-pages.spec.ts │ └── state-var-scopes.spec.ts ├── tsconfig.bin.json ├── tsconfig.json ├── tsconfig.node.json ├── vite.config.ts └── vitest.config.ts ``` # Files -------------------------------------------------------------------------------- /xmlui/src/components/Icon/TableDeleteRowIcon.tsx: -------------------------------------------------------------------------------- ```typescript 1 | import React from "react"; 2 | export default function TableDeleteRowIcon(props) { 3 | return ( 4 | <svg 5 | viewBox="0 0 24 16" 6 | stroke="currentColor" 7 | fill="none" 8 | strokeWidth="1.5" 9 | strokeLinecap="round" 10 | strokeLinejoin="round" 11 | {...props} 12 | > 13 | <rect x="1.5" y="1.5" width="13" height="11" rx="1" /> 14 | <line x1="1.5" y1="5.5" x2="14.5" y2="5.5" /> 15 | <line x1="1.5" y1="9.5" x2="14.5" y2="9.5" /> 16 | {/* Minus sign for delete */} 17 | <line x1="17" y1="8" x2="21" y2="8" /> 18 | </svg> 19 | ); 20 | } ``` -------------------------------------------------------------------------------- /packages/xmlui-website-blocks/src/index.tsx: -------------------------------------------------------------------------------- ```typescript 1 | import { heroSectionComponentRenderer } from "./HeroSection/HeroSection"; 2 | import { scrollToTopComponentRenderer } from "./ScrollToTop/ScrollToTop"; 3 | import { fancyButtonRenderer } from "./FancyButton/FancyButton"; 4 | import { carouselComponentRenderer } from "./Carousel/Carousel"; 5 | import { helloRenderer } from "./Hello/Hello"; 6 | 7 | export default { 8 | namespace: "XMLUIExtensions", 9 | components: [ 10 | heroSectionComponentRenderer, 11 | scrollToTopComponentRenderer, 12 | fancyButtonRenderer, 13 | carouselComponentRenderer, 14 | helloRenderer 15 | ] 16 | }; 17 | ``` -------------------------------------------------------------------------------- /xmlui/src/components/PositionedContainer/PositionedContainerNative.tsx: -------------------------------------------------------------------------------- ```typescript 1 | import type { ReactNode } from "react"; 2 | import { CSSProperties } from "react"; 3 | import classnames from "classnames"; 4 | 5 | import styles from "./PositionedContainer.module.scss"; 6 | 7 | type Props = { 8 | children: ReactNode; 9 | className?: string; 10 | visibleOnHover: boolean; 11 | }; 12 | 13 | export function PositionedContainer({ 14 | children, 15 | className, 16 | visibleOnHover = false, 17 | }: Props) { 18 | return ( 19 | <div 20 | className={classnames(styles.wrapper, className, { 21 | [styles.visibleOnHover]: visibleOnHover, 22 | })} 23 | > 24 | {children} 25 | </div> 26 | ); 27 | } 28 | ``` -------------------------------------------------------------------------------- /packages/xmlui-spreadsheet/src/SpreadsheetNative.tsx: -------------------------------------------------------------------------------- ```typescript 1 | import React, { useEffect, useRef } from "react"; 2 | import jspreadsheet from "jspreadsheet-ce"; 3 | import "jspreadsheet-ce/dist/jspreadsheet.css"; 4 | 5 | interface JSpreadsheetProps { 6 | worksheets: jspreadsheet.WorksheetOptions[]; 7 | } 8 | 9 | const JSpreadsheet: React.FC<JSpreadsheetProps> = ({ worksheets }) => { 10 | const tableRef = useRef<HTMLDivElement>(null); 11 | 12 | useEffect(() => { 13 | if (tableRef.current) { 14 | jspreadsheet(tableRef.current, { 15 | worksheets, 16 | }); 17 | } 18 | }, []); 19 | 20 | return <div ref={tableRef} />; 21 | }; 22 | 23 | export default JSpreadsheet; 24 | ``` -------------------------------------------------------------------------------- /xmlui/src/components/Icon/TableInsertRowIcon.tsx: -------------------------------------------------------------------------------- ```typescript 1 | import React from "react"; 2 | export default function TableInsertRowIcon(props) { 3 | return ( 4 | <svg 5 | viewBox="0 0 24 16" 6 | stroke="currentColor" 7 | fill="none" 8 | strokeWidth="1.5" 9 | strokeLinecap="round" 10 | strokeLinejoin="round" 11 | {...props} 12 | > 13 | <rect x="1.5" y="1.5" width="13" height="11" rx="1" /> 14 | <line x1="1.5" y1="5.5" x2="14.5" y2="5.5" /> 15 | <line x1="1.5" y1="9.5" x2="14.5" y2="9.5" /> 16 | <line x1="19" y1="6" x2="19" y2="10" /> 17 | <line x1="17" y1="8" x2="21" y2="8" /> 18 | </svg> 19 | ); 20 | } ``` -------------------------------------------------------------------------------- /xmlui/src/components/Stack/HStack.md: -------------------------------------------------------------------------------- ```markdown 1 | `HStack` is a specialized, shorthand version for the regular `Stack` component with a horizontal orientation. 2 | 3 | ```xmlui-pg copy display name="Example: HStack" 4 | <App> 5 | <HStack> 6 | <Stack height="32px" width="32px" backgroundColor="red" /> 7 | <Stack height="32px" width="32px" backgroundColor="blue" /> 8 | <Stack height="32px" width="32px" backgroundColor="green" /> 9 | </HStack> 10 | </App> 11 | ``` 12 | 13 | >[!INFO] 14 | > You cannot change the orientation of `HStack` from horizontal to vertical by setting the `orientation` prop, as the engine ignores that setting. 15 | ``` -------------------------------------------------------------------------------- /xmlui/src/components/Option/OptionTypeProvider.tsx: -------------------------------------------------------------------------------- ```typescript 1 | import type { ComponentType, ReactNode } from "react"; 2 | import React from "react"; 3 | 4 | import type { Option } from "../abstractions"; 5 | 6 | const OptionTypeContext = React.createContext<ComponentType<Option>>(null); 7 | 8 | export function useOptionType() { 9 | return React.useContext(OptionTypeContext); 10 | } 11 | 12 | function OptionTypeProvider({ 13 | children, 14 | Component, 15 | }: { 16 | children: ReactNode; 17 | Component: ComponentType<Option>; 18 | }) { 19 | return <OptionTypeContext.Provider value={Component}>{children}</OptionTypeContext.Provider>; 20 | } 21 | 22 | export default OptionTypeProvider; 23 | ``` -------------------------------------------------------------------------------- /xmlui/src/components-core/theming/utils.ts: -------------------------------------------------------------------------------- ```typescript 1 | /** 2 | * Each theme can have a light or a dark tone. 3 | */ 4 | export const ThemeToneKeys = ["light", "dark"] as const; 5 | 6 | export const SizeScaleKeys = { 7 | // small scale 8 | none: "none", 9 | xs: "xs", 10 | sm: "sm", 11 | md: "md", 12 | // large scale 13 | lg: "lg", 14 | xl: "xl", 15 | "2xl": "2xl", 16 | "3xl": "3xl", 17 | } as const; 18 | 19 | export const SizeScaleReadableKeys = { 20 | // small scale 21 | none: "None", 22 | xs: "Extra Small", 23 | sm: "Small", 24 | md: "Medium", 25 | // large scale 26 | lg: "Large", 27 | xl: "Extra Large", 28 | "2xl": "Double Extra Large", 29 | "3xl": "Triple Extra Large", 30 | } as const; 31 | ``` -------------------------------------------------------------------------------- /xmlui/src/components/Pages/Page.md: -------------------------------------------------------------------------------- ```markdown 1 | %-DESC-START 2 | 3 | **Key features:** 4 | - **Navigation**: Activated by [NavLink](/components/NavLink) or programmatic navigation (`Actions.navigate()`) 5 | - **Content container**: Wraps any XMLUI components to define what displays for each route 6 | - **URL pattern matching**: Maps exact URLs or dynamic patterns with parameters to specific content 7 | - **Route parameters**: Supports dynamic URL segments (e.g., `/user/:id`) accessible via `$routeParams` 8 | - **Query parameter access**: Retrieves URL query parameters through `$queryParams` context variable 9 | 10 | %-DESC-END 11 | ``` -------------------------------------------------------------------------------- /packages/xmlui-playground/src/playground/ToneSwitcher.tsx: -------------------------------------------------------------------------------- ```typescript 1 | import { forwardRef } from "react"; 2 | import { type ThemeTone, ToneChangerButton } from "xmlui"; 3 | import { toneChanged } from "../state/store"; 4 | import { usePlayground } from "../hooks/usePlayground"; 5 | 6 | export const ToneSwitcher = forwardRef<HTMLDivElement>((props, ref) => { 7 | const { dispatch } = usePlayground(); 8 | return ( 9 | <div ref={ref} {...props}> 10 | <ToneChangerButton 11 | onClick={(activeTone: ThemeTone) => { 12 | dispatch(toneChanged(activeTone)); 13 | }} 14 | /> 15 | </div> 16 | ); 17 | }); 18 | 19 | ToneSwitcher.displayName = "ToneSwitcher"; 20 | ``` -------------------------------------------------------------------------------- /xmlui/src/components/Slider/Slider.md: -------------------------------------------------------------------------------- ```markdown 1 | %-DESC-START 2 | 3 | **Key features:** 4 | - **Range selection**: Single value or dual-thumb range selection with configurable minimum separation 5 | - **Step control**: Precise incremental selection with customizable step values 6 | - **Value formatting**: Custom display formatting for current values and visual feedback 7 | 8 | %-DESC-END 9 | 10 | %-PROP-START initialValue 11 | 12 | ```xmlui-pg 13 | <Slider initialValue="5" /> 14 | ``` 15 | 16 | %-PROP-END 17 | 18 | %-PROP-START minValue 19 | 20 | ```xmlui-pg 21 | <Slider minValue="10" /> 22 | ``` 23 | 24 | %-PROP-END 25 | 26 | %-PROP-START maxValue 27 | 28 | ```xmlui-pg 29 | <Slider maxValue="30" /> 30 | ``` 31 | 32 | %-PROP-END ``` -------------------------------------------------------------------------------- /xmlui/src/components/Stack/VStack.md: -------------------------------------------------------------------------------- ```markdown 1 | `VStack` is a specialized, shorthand version for the regular [Stack](./Stack) component with a vertical orientation. 2 | 3 | ```xmlui-pg copy display name="Example: VStack" 4 | <App> 5 | <VStack> 6 | <Stack height="32px" width="32px" backgroundColor="red" /> 7 | <Stack height="32px" width="32px" backgroundColor="blue" /> 8 | <Stack height="32px" width="32px" backgroundColor="green" /> 9 | </VStack> 10 | </App> 11 | ``` 12 | 13 | >[!INFO] 14 | > You cannot change the orientation of `VStack` from vertical to horizontal by setting the `orientation` prop, as the engine ignores that setting. 15 | ``` -------------------------------------------------------------------------------- /xmlui/src/components/SpaceFiller/SpaceFiller.module.scss: -------------------------------------------------------------------------------- ```scss 1 | @use "../../components-core/theming/themes" as t; 2 | 3 | // --- This code snippet is required to collect the theme variables used in this module 4 | $themeVars: (); 5 | @function createThemeVar($componentVariable) { 6 | $themeVars: t.appendThemeVar($themeVars, $componentVariable) !global; 7 | @return t.getThemeVar($themeVars, $componentVariable); 8 | } 9 | 10 | @layer components { 11 | .spacer { 12 | flex: 1 1 0 !important; 13 | place-self: stretch; 14 | } 15 | } 16 | 17 | // --- We export the theme variables to add them to the component renderer 18 | :export { 19 | themeVars: t.json-stringify($themeVars); 20 | } 21 | ``` -------------------------------------------------------------------------------- /packages/xmlui-playground/src/playground/StandalonePlayground.tsx: -------------------------------------------------------------------------------- ```typescript 1 | import { createComponentRenderer, createMetadata, parseScssVar } from "xmlui"; 2 | import { StandalonePlayground } from "./StandalonePlaygroundNative"; 3 | 4 | const COMP = "StandalonePlayground"; 5 | 6 | export const StandalonePlaygroundMd = createMetadata({ 7 | description: "XMLUI StandalonePlayground component.", 8 | status: "experimental", 9 | props: {}, 10 | themeVars: parseScssVar({}), 11 | defaultThemeVars: {}, 12 | }); 13 | 14 | export const standalonePlaygroundComponentRenderer = createComponentRenderer( 15 | COMP, 16 | StandalonePlaygroundMd, 17 | () => { 18 | return <StandalonePlayground />; 19 | }, 20 | ); 21 | ``` -------------------------------------------------------------------------------- /xmlui/src/components/Charts/PieChart/PieChart.md: -------------------------------------------------------------------------------- ```markdown 1 | %-DESC-START 2 | 3 | **Key features:** 4 | - **Proportional visualization**: Displays data segments as slices of a complete circle 5 | - **Flexible labeling**: Configurable label positions both inside and outside chart segments 6 | - **Data binding**: Connects to array data with specified keys for values and labels 7 | - **Label list display**: Optional legend-style list showing all segments and values 8 | - **Customizable sizing**: Configurable dimensions and outer radius for different layouts 9 | 10 | For a variation with a hollow center, see [DonutChart](/components/DonutChart). 11 | 12 | %-DESC-END ``` -------------------------------------------------------------------------------- /xmlui/src/components/Slot/Slot.ts: -------------------------------------------------------------------------------- ```typescript 1 | import { createMetadata, d } from "../metadata-helpers"; 2 | import { createPropHolderComponent } from "../../components-core/renderers"; 3 | 4 | const COMP = "Slot"; 5 | 6 | export const SlotMd = createMetadata({ 7 | status: "experimental", 8 | description: 9 | "Placeholder in a reusable component. " + 10 | "Signs the slot where the component's injected children should be rendered.", 11 | props: { 12 | name: d(`This optional property defines the name of the slot.`), 13 | }, 14 | allowArbitraryProps: true, 15 | opaque: true 16 | }); 17 | 18 | export const SlotHolder = createPropHolderComponent(COMP, SlotMd); 19 | ``` -------------------------------------------------------------------------------- /xmlui/src/components/Carousel/CarouselItem.tsx: -------------------------------------------------------------------------------- ```typescript 1 | import { createComponentRenderer } from "../../components-core/renderers"; 2 | import { createMetadata } from "../metadata-helpers"; 3 | import { CarouselItemComponent } from "./CarouselItemNative"; 4 | 5 | const COMP = "CarouselItem"; 6 | 7 | export const CarouselItemMd = createMetadata({ 8 | status: "in progress", 9 | }); 10 | 11 | export const carouselItemComponentRenderer = createComponentRenderer( 12 | COMP, 13 | CarouselItemMd, 14 | (rendererContext) => { 15 | const { node, renderChild } = rendererContext; 16 | return <CarouselItemComponent>{renderChild(node.children)}</CarouselItemComponent>; 17 | }, 18 | ); 19 | ``` -------------------------------------------------------------------------------- /xmlui/src/components/Charts/LabelList/LabelListNative.module.scss: -------------------------------------------------------------------------------- ```scss 1 | @use "xmlui/themes.scss" as t; 2 | 3 | // --- This code snippet is required to collect the theme variables used in this module 4 | $themeVars: (); 5 | @function createThemeVar($componentVariable) { 6 | $themeVars: t.appendThemeVar($themeVars, $componentVariable) !global; 7 | @return t.getThemeVar($themeVars, $componentVariable); 8 | } 9 | 10 | 11 | $componentName: "LabelList"; 12 | 13 | @layer components { 14 | .labelList { 15 | fill: createThemeVar("textColor-LabelList"); 16 | } 17 | } 18 | 19 | 20 | // --- We export the theme variables to add them to the component renderer 21 | :export { 22 | themeVars: t.json-stringify($themeVars) 23 | } 24 | ``` -------------------------------------------------------------------------------- /xmlui/src/components/Charts/BarChart/BarChart.module.scss: -------------------------------------------------------------------------------- ```scss 1 | @use "xmlui/themes.scss" as t; 2 | 3 | // --- This code snippet is required to collect the theme variables used in this module 4 | $themeVars: ( 5 | ); 6 | 7 | @function createThemeVar($componentVariable) { 8 | $themeVars: t.appendThemeVar($themeVars, $componentVariable) !global; 9 | @return t.getThemeVar($themeVars, $componentVariable); 10 | } 11 | 12 | $componentName: "BarChart"; 13 | 14 | @layer components { 15 | 16 | .wrapper { 17 | width: 100%; 18 | height: 100%; 19 | min-height: 0; 20 | } 21 | } 22 | 23 | // --- We export the theme variables to add them to the component renderer 24 | :export { 25 | themeVars: t.json-stringify($themeVars); 26 | } ``` -------------------------------------------------------------------------------- /xmlui/src/components/Charts/LineChart/LineChart.module.scss: -------------------------------------------------------------------------------- ```scss 1 | @use "xmlui/themes.scss" as t; 2 | 3 | // --- This code snippet is required to collect the theme variables used in this module 4 | $themeVars: ( 5 | ); 6 | 7 | @function createThemeVar($componentVariable) { 8 | $themeVars: t.appendThemeVar($themeVars, $componentVariable) !global; 9 | @return t.getThemeVar($themeVars, $componentVariable); 10 | } 11 | 12 | $componentName: "LineChart"; 13 | 14 | @layer components { 15 | 16 | .wrapper { 17 | width: 100%; 18 | height: 100%; 19 | min-height: 0; 20 | } 21 | } 22 | 23 | // --- We export the theme variables to add them to the component renderer 24 | :export { 25 | themeVars: t.json-stringify($themeVars); 26 | } ``` -------------------------------------------------------------------------------- /xmlui/src/components/Icon/TableDeleteColumnIcon.tsx: -------------------------------------------------------------------------------- ```typescript 1 | import React from "react"; 2 | export default function TableDeleteColumnIcon(props) { 3 | return ( 4 | <svg 5 | viewBox="0 0 24 16" 6 | stroke="currentColor" 7 | fill="none" 8 | strokeWidth="1.5" 9 | strokeLinecap="round" 10 | strokeLinejoin="round" 11 | width="24" 12 | height="16" 13 | {...props} 14 | > 15 | <rect x="1.5" y="1.5" width="13" height="11" rx="1" /> 16 | <line x1="5.5" y1="3.5" x2="5.5" y2="11.5" /> 17 | <line x1="9" y1="3.5" x2="9" y2="11.5" /> 18 | {/* Minus sign for delete */} 19 | <line x1="17" y1="8" x2="21" y2="8" /> 20 | </svg> 21 | ); 22 | } ``` -------------------------------------------------------------------------------- /packages/xmlui-website-blocks/CHANGELOG.md: -------------------------------------------------------------------------------- ```markdown 1 | # xmlui-website-blocks 2 | 3 | ## 0.1.4 4 | 5 | ### Patch Changes 6 | 7 | - d4133e2: Add HeroSection and ScrollToTop components to xmlui-website-blocks 8 | 9 | ## 0.1.3 10 | 11 | ### Patch Changes 12 | 13 | - e42d367: Add FancyButton to xmlui-website-blocks 14 | - 8a3d5cd: Add HeroSection and ScrollToTop components to xmlui-website-blocks 15 | - 819b563: Update fontSize and lineHeight themes and style (may break existing xmlui code) 16 | 17 | ## 0.1.2 18 | 19 | ### Patch Changes 20 | 21 | - fff80c5: Bump package version 22 | 23 | ## 0.1.1 24 | 25 | ### Patch Changes 26 | 27 | - 879c09d: Component part handling and testing refactored 28 | - 5032e4a: Experimenting with HeroSection 29 | ``` -------------------------------------------------------------------------------- /xmlui/tests-e2e/state-scope-in-pages.spec.ts: -------------------------------------------------------------------------------- ```typescript 1 | import { test, expect } from "../src/testing/fixtures"; 2 | import { initApp } from "../src/testing/themed-app-test-helpers"; 3 | 4 | test("state in page is available in app root", async ({ page }) => { 5 | await initApp(page, { 6 | entryPoint: ` 7 | <App var.varBasedOnNumberOfItems="{numberOfItems.value * 2}"> 8 | <Pages> 9 | <Page url="/"> 10 | <NumberBox initialValue="20" id="numberOfItems"/> 11 | <Text testId="value">{varBasedOnNumberOfItems}</Text> 12 | </Page> 13 | </Pages> 14 | </App> 15 | `, 16 | }); 17 | 18 | await expect(page.getByTestId("value")).toHaveText("40"); 19 | }); 20 | ``` -------------------------------------------------------------------------------- /packages/xmlui-website-blocks/meta/componentsMetadata.ts: -------------------------------------------------------------------------------- ```typescript 1 | import { HeroSectionMd } from "../src/HeroSection/HeroSection" 2 | import { ScrollToTopMd } from "../src/ScrollToTop/ScrollToTop" 3 | import { CarouselMd } from "../src/Carousel/Carousel" 4 | import { HelloMd } from "../src/Hello/Hello" 5 | import { FancyButtonMd } from "../src/FancyButton/FancyButton" 6 | 7 | export const componentMetadata = { 8 | name: "Websites", 9 | state: "experimental", 10 | description: "This package contains components...", 11 | metadata: { 12 | Hello: HelloMd, 13 | HeroSection: HeroSectionMd, 14 | ScrollToTop: ScrollToTopMd, 15 | Carousel: CarouselMd, 16 | FancyButton: FancyButtonMd, 17 | }, 18 | }; 19 | ``` -------------------------------------------------------------------------------- /xmlui/src/components/Icon/TableInsertColumnIcon.tsx: -------------------------------------------------------------------------------- ```typescript 1 | import React from "react"; 2 | export default function TableInsertColumnIcon(props) { 3 | return ( 4 | <svg 5 | viewBox="0 0 24 16" 6 | stroke="currentColor" 7 | fill="none" 8 | strokeWidth="1.5" 9 | strokeLinecap="round" 10 | strokeLinejoin="round" 11 | width="24" 12 | height="16" 13 | {...props} 14 | > 15 | <rect x="1.5" y="1.5" width="13" height="11" rx="1" /> 16 | <line x1="5.5" y1="3.5" x2="5.5" y2="11.5" /> 17 | <line x1="9" y1="3.5" x2="9" y2="11.5" /> 18 | <line x1="19" y1="6.5" x2="19" y2="9.5" /> 19 | <line x1="17.5" y1="8" x2="20.5" y2="8" /> 20 | </svg> 21 | ); 22 | } ``` -------------------------------------------------------------------------------- /packages/xmlui-website-blocks/src/vite-env.d.ts: -------------------------------------------------------------------------------- ```typescript 1 | /// <reference types="vite/client" /> 2 | 3 | // Type declarations for XMLUI files 4 | declare module "*.xmlui" { 5 | interface XmluiModule { 6 | component: any; 7 | src: string; 8 | file: string; 9 | } 10 | const content: XmluiModule; 11 | export default content; 12 | } 13 | 14 | declare module "*.xmlui.xs" { 15 | interface XmluiCodeBehindModule { 16 | [key: string]: any; 17 | src: string; 18 | } 19 | const content: XmluiCodeBehindModule; 20 | export default content; 21 | } 22 | 23 | declare module "*.xs" { 24 | interface XmluiScriptModule { 25 | [key: string]: any; 26 | src: string; 27 | } 28 | const content: XmluiScriptModule; 29 | export default content; 30 | } ``` -------------------------------------------------------------------------------- /xmlui/src/language-server/server-web-worker.ts: -------------------------------------------------------------------------------- ```typescript 1 | import { createConnection, BrowserMessageReader, BrowserMessageWriter } from 'vscode-languageserver/browser'; 2 | import * as serverCommon from "./server-common" 3 | 4 | /// <reference lib="WebWorker" /> 5 | 6 | // declare const self: DedicatedWorkerGlobalScope; 7 | const messageReader = new BrowserMessageReader(self); 8 | messageReader.listen((message) => { 9 | console.log('Received message from main thread:', message); 10 | }); 11 | const messageWriter = new BrowserMessageWriter(self); 12 | const connection = createConnection(messageReader, messageWriter); 13 | console.log("starting lang server") 14 | serverCommon.start(connection) 15 | ``` -------------------------------------------------------------------------------- /xmlui/tests-e2e/scripting.spec.ts: -------------------------------------------------------------------------------- ```typescript 1 | import { expect, test } from "../src/testing/fixtures"; 2 | import { initApp } from "../src/testing/themed-app-test-helpers"; 3 | 4 | // ================================================================= 5 | // The testes regarding overflow="scroll" are inside the stack tests 6 | // ================================================================= 7 | 8 | test("Template literal", async ({ page }) => { 9 | const entryPoint = '<Text testId="text0" value="see {`${1 + 2} kind`} horses"/>'; 10 | 11 | await initApp(page, { 12 | entryPoint, 13 | }); 14 | 15 | await expect(page.getByTestId("text0")).toHaveText("see 3 kind horses",); 16 | }); 17 | 18 | ``` -------------------------------------------------------------------------------- /blog/scripts/utils.js: -------------------------------------------------------------------------------- ```javascript 1 | const XMLUI_STANDALONE_PATTERN = /xmlui-\d+\.\d+\.\d+\w*\.js/; 2 | 3 | function sortByVersion(a, b) { 4 | /** @type {string} */ 5 | const versionStrA = a.tag_name.split("@")[1]; 6 | /** @type {string} */ 7 | const versionStrB = b.tag_name.split("@")[1]; 8 | 9 | const [majorA, minorA, patchA] = versionStrA.split(".").map(Number); 10 | const [majorB, minorB, patchB] = versionStrB.split(".").map(Number); 11 | 12 | if (majorB !== majorA) { 13 | return majorB - majorA; 14 | } 15 | 16 | if (minorB !== minorA) { 17 | return minorB - minorA; 18 | } 19 | 20 | return patchB - patchA; 21 | } 22 | 23 | module.exports = { 24 | XMLUI_STANDALONE_PATTERN, 25 | sortByVersion 26 | }; 27 | ``` -------------------------------------------------------------------------------- /docs/scripts/utils.js: -------------------------------------------------------------------------------- ```javascript 1 | const XMLUI_STANDALONE_PATTERN = /xmlui-\d+\.\d+\.\d+\w*\.js/; 2 | 3 | function sortByVersion(a, b) { 4 | /** @type {string} */ 5 | const versionStrA = a.tag_name.split("@")[1]; 6 | /** @type {string} */ 7 | const versionStrB = b.tag_name.split("@")[1]; 8 | 9 | const [majorA, minorA, patchA] = versionStrA.split(".").map(Number); 10 | const [majorB, minorB, patchB] = versionStrB.split(".").map(Number); 11 | 12 | if (majorB !== majorA) { 13 | return majorB - majorA; 14 | } 15 | 16 | if (minorB !== minorA) { 17 | return minorB - minorA; 18 | } 19 | 20 | return patchB - patchA; 21 | } 22 | 23 | module.exports = { 24 | XMLUI_STANDALONE_PATTERN, 25 | sortByVersion 26 | }; 27 | ``` -------------------------------------------------------------------------------- /docs/content/components/xmlui-pdf/Pdf.md: -------------------------------------------------------------------------------- ```markdown 1 | # Pdf [#pdf] 2 | 3 | The `Pdf` component provides a read-only preview of a pdf document's contents. 4 | 5 | ## Properties 6 | 7 | ### `src` 8 | 9 | This property defines the source URL of the pdf document to display. 10 | 11 | ## Events 12 | 13 | This component does not have any events. 14 | 15 | ## Exposed Methods 16 | 17 | This component does not expose any methods. 18 | 19 | ## Styling 20 | 21 | ### Theme Variables 22 | 23 | | Variable | Default Value (Light) | Default Value (Dark) | 24 | | --- | --- | --- | 25 | | [boxShadow](../styles-and-themes/common-units/#boxShadow)-page-Pdf | $boxShadow-md | $boxShadow-md | 26 | | [gap](../styles-and-themes/common-units/#size)-pages-Pdf | $space-4 | $space-4 | 27 | ``` -------------------------------------------------------------------------------- /packages/xmlui-animations/src/index.tsx: -------------------------------------------------------------------------------- ```typescript 1 | import { scaleAnimationRenderer } from "./ScaleAnimation"; 2 | import { fadeInAnimationRenderer } from "./FadeInAnimation"; 3 | import { slideInAnimationRenderer } from "./SlideInAnimation"; 4 | import { fadeOutAnimationRenderer } from "./FadeOutAnimation"; 5 | import { animationComponentRenderer } from "./Animation"; 6 | import { fadeAnimationRenderer } from "./FadeAnimation"; 7 | 8 | 9 | export default { 10 | namespace: "XMLUIExtensions", 11 | components: [ 12 | animationComponentRenderer, 13 | fadeAnimationRenderer, 14 | fadeInAnimationRenderer, 15 | fadeOutAnimationRenderer, 16 | slideInAnimationRenderer, 17 | scaleAnimationRenderer] 18 | }; 19 | ``` -------------------------------------------------------------------------------- /xmlui/src/components/Stack/CHStack.md: -------------------------------------------------------------------------------- ```markdown 1 | `CHStack` is a specialized, shorthand version for the regular `Stack` component that has a horizontal orientation with its contents centered. 2 | 3 | ```xmlui-pg copy display name="Example: CHStack" 4 | <App> 5 | <CHStack backgroundColor="cyan"> 6 | <Stack height="32px" width="32px" backgroundColor="red" /> 7 | <Stack height="32px" width="32px" backgroundColor="blue" /> 8 | <Stack height="32px" width="32px" backgroundColor="green" /> 9 | </CHStack> 10 | </App> 11 | ``` 12 | 13 | >[!INFO] 14 | > You cannot change the orientation of `CHStack` from horizontal to vertical by setting the `orientation` prop, as the engine ignores that setting. 15 | ``` -------------------------------------------------------------------------------- /xmlui/tsconfig.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "compilerOptions": { 3 | "target": "es2015", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "esModuleInterop": true, 8 | "allowSyntheticDefaultImports": true, 9 | "strict": true, 10 | "strictNullChecks": false, 11 | "noImplicitAny": false, 12 | "forceConsistentCasingInFileNames": true, 13 | "noFallthroughCasesInSwitch": true, 14 | "module": "esnext", 15 | "moduleResolution": "node", 16 | "resolveJsonModule": true, 17 | "isolatedModules": true, 18 | "noEmit": true, 19 | "jsx": "react-jsx" 20 | }, 21 | "include": ["src", "tests", "index.ts"], 22 | "exclude": ["ests"] 23 | } 24 | ``` -------------------------------------------------------------------------------- /packages/xmlui-playground/src/playground/Preview.tsx: -------------------------------------------------------------------------------- ```typescript 1 | import { useMemo } from "react"; 2 | import { usePlayground } from "../hooks/usePlayground"; 3 | import { NestedApp } from "xmlui"; 4 | 5 | export function Preview() { 6 | const { appDescription, options } = usePlayground(); 7 | 8 | let components = useMemo( 9 | () => appDescription.components.map((comp) => comp.component), 10 | [appDescription.components], 11 | ); 12 | return ( 13 | <NestedApp 14 | app={appDescription.app} 15 | activeTone={options.activeTone} 16 | activeTheme={options.activeTheme} 17 | api={appDescription.api} 18 | components={components} 19 | config={appDescription.config} 20 | height={"100%"} 21 | /> 22 | ); 23 | } 24 | ``` -------------------------------------------------------------------------------- /xmlui/src/components/Stack/CVStack.md: -------------------------------------------------------------------------------- ```markdown 1 | `CVStack` is a specialized, shorthand version for the regular `Stack` component with a vertical orientation centered on its contents. 2 | 3 | ```xmlui-pg copy display name="Example: CVStack" 4 | <App> 5 | <CVStack width="33%" backgroundColor="cyan"> 6 | <Stack height="32px" width="32px" backgroundColor="red" /> 7 | <Stack height="32px" width="32px" backgroundColor="blue" /> 8 | <Stack height="32px" width="32px" backgroundColor="green" /> 9 | </CVStack> 10 | </App> 11 | ``` 12 | 13 | >[!INFO] 14 | > You cannot change the orientation of `CVStack` from vertical to horizontal by setting the `orientation` prop, as the engine ignores that setting. 15 | ``` -------------------------------------------------------------------------------- /xmlui/tests-e2e/push-to-array-regression.spec.ts: -------------------------------------------------------------------------------- ```typescript 1 | import { expect, test } from "../src/testing/fixtures"; 2 | import { initApp } from "../src/testing/themed-app-test-helpers"; 3 | 4 | test("push to array", async ({ page }) => { 5 | await initApp(page, { 6 | entryPoint: ` 7 | <Fragment var.fruits="{['1', '2']}" > 8 | <Button id="addSomething" onClick="fruits.push('something')">Add</Button> 9 | <Text id="fruits_text">{fruits.join(',')}</Text> 10 | </Fragment> 11 | `, 12 | }); 13 | 14 | await expect(page.getByTestId("fruits_text")).toHaveText("1,2"); 15 | await page.getByTestId("addSomething").click(); 16 | await expect(page.getByTestId("fruits_text")).toHaveText("1,2,something"); 17 | }); 18 | ``` -------------------------------------------------------------------------------- /packages/xmlui-devtools/src/devtools/DevToolsNative.module.scss: -------------------------------------------------------------------------------- ```scss 1 | @use "xmlui/themes.scss" as themes; 2 | 3 | .xmluiEditor { 4 | flex-grow: 1; 5 | width: 100%; 6 | max-width: 100%; 7 | height: 100%; 8 | min-height: 400px; 9 | } 10 | 11 | .editorContainer { 12 | flex: 1 1 auto; 13 | min-height: 0; 14 | position: relative; 15 | display: flex; 16 | flex-direction: row; 17 | height: 100%; 18 | width: 100%; 19 | 20 | .copyButton { 21 | z-index: 9999; 22 | position: absolute; 23 | top: 16px; 24 | right: 16px; 25 | border: none; 26 | padding: 4px; 27 | border-radius: 5px; 28 | cursor: pointer; 29 | display: none; 30 | align-items: center; 31 | gap: 5px; 32 | transition: opacity 0.2s; 33 | } 34 | 35 | &:hover { 36 | .copyButton { 37 | display: flex; 38 | } 39 | } 40 | } 41 | 42 | ``` -------------------------------------------------------------------------------- /xmlui/src/components/Icon/svg/database.svg: -------------------------------------------------------------------------------- ``` 1 | <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M12 8C16.9706 8 21 6.65685 21 5C21 3.34315 16.9706 2 12 2C7.02944 2 3 3.34315 3 5C3 6.65685 7.02944 8 12 8Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> <path d="M21 12C21 13.66 17 15 12 15C7 15 3 13.66 3 12" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> <path d="M3 5V19C3 20.66 7 22 12 22C17 22 21 20.66 21 19V5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> </svg> ``` -------------------------------------------------------------------------------- /xmlui/src/components/Theme/Theme.module.scss: -------------------------------------------------------------------------------- ```scss 1 | @use "../../components-core/theming/themes" as t; 2 | 3 | @layer components { 4 | .wrapper{ 5 | //it makes the wrapper element behave like an 'invisible' element, so does not affect layout 6 | display: contents; 7 | } 8 | 9 | .root{ 10 | font-family: t.$fontFamily; 11 | background-color: t.$backgroundColor; 12 | font-size: t.$fontSize; 13 | font-weight: t.$fontWeight; 14 | color: t.$textColor-primary; 15 | direction: t.$direction; 16 | font-feature-settings: t.$font-feature-settings; 17 | --stack-gap-default: #{t.$space-4}; 18 | } 19 | 20 | .baseRootComponent { 21 | width: 100%; 22 | position: relative; 23 | height: inherit; 24 | overflow: auto; 25 | } 26 | } ``` -------------------------------------------------------------------------------- /xmlui/src/components/Icon/SortAscendingIcon.tsx: -------------------------------------------------------------------------------- ```typescript 1 | import type { IconBaseProps } from "./IconNative"; 2 | 3 | export const SortAscendingIcon = (props: IconBaseProps) => { 4 | return ( 5 | <svg 6 | width="100%" 7 | height="100%" 8 | viewBox="0 0 24 24" 9 | version="1.1" 10 | xmlns="http://www.w3.org/2000/svg" 11 | fillRule="evenodd" 12 | clipRule="evenodd" 13 | strokeLinejoin="round" 14 | strokeMiterlimit="2" 15 | {...props} 16 | > 17 | <rect id="sortasc" x="0" y="0" width="24" height="24" fill="none" /> 18 | <path d="M12,2l7,8l-14,-0l7,-8Z" fill="currentColor" /> 19 | <path d="M12,22l-7,-8l14,-0l-7,8Z" fill="currentColor" fillOpacity={0.5} /> 20 | </svg> 21 | ) 22 | } 23 | ``` -------------------------------------------------------------------------------- /xmlui/src/components/Icon/SortDescendingIcon.tsx: -------------------------------------------------------------------------------- ```typescript 1 | import type { IconBaseProps } from "./IconNative"; 2 | 3 | export const SortDescendingIcon = (props: IconBaseProps) => { 4 | return ( 5 | <svg 6 | width="100%" 7 | height="100%" 8 | viewBox="0 0 24 24" 9 | version="1.1" 10 | xmlns="http://www.w3.org/2000/svg" 11 | fillRule="evenodd" 12 | clipRule="evenodd" 13 | strokeLinejoin="round" 14 | strokeMiterlimit="2" 15 | {...props} 16 | > 17 | <rect id="sortasc" x="0" y="0" width="24" height="24" fill="none" /> 18 | <path d="M12,2l7,8l-14,-0l7,-8Z" fill="currentColor" fillOpacity={0.5} /> 19 | <path d="M12,22l-7,-8l14,-0l-7,8Z" fill="currentColor" /> 20 | </svg> 21 | ) 22 | } 23 | ``` -------------------------------------------------------------------------------- /xmlui/src/components/Icon/NoSortIcon.tsx: -------------------------------------------------------------------------------- ```typescript 1 | import type { IconBaseProps } from "./IconNative"; 2 | 3 | export const NoSortIcon = (props: IconBaseProps) => { 4 | return ( 5 | <svg 6 | width="100%" 7 | height="100%" 8 | viewBox="0 0 24 24" 9 | version="1.1" 10 | xmlns="http://www.w3.org/2000/svg" 11 | fillRule="evenodd" 12 | clipRule="evenodd" 13 | strokeLinejoin="round" 14 | strokeMiterlimit="2" 15 | {...props} 16 | > 17 | <rect id="sortasc" x="0" y="0" width="24" height="24" fill="none" /> 18 | <path d="M12,2l7,8l-14,-0l7,-8Z" fill="currentColor" fillOpacity={0.5} /> 19 | <path d="M12,22l-7,-8l14,-0l-7,8Z" fill="currentColor" fillOpacity={0.5} /> 20 | </svg> 21 | ) 22 | } 23 | ``` -------------------------------------------------------------------------------- /packages/xmlui-playground/src/playground/Tooltip.tsx: -------------------------------------------------------------------------------- ```typescript 1 | import { Provider, Root, Portal, Trigger, Content } from "@radix-ui/react-tooltip"; 2 | import { type ReactNode } from "react"; 3 | import { useTheme } from "xmlui"; 4 | import styles from "./Tooltip.module.scss"; 5 | 6 | export const Tooltip = ({ children, label }: { children: ReactNode; label: string }) => { 7 | const { root } = useTheme(); 8 | return ( 9 | <Provider> 10 | <Root> 11 | <Trigger asChild> 12 | <div>{children}</div> 13 | </Trigger> 14 | <Portal container={root}> 15 | <Content className={styles.TooltipContent} sideOffset={5}> 16 | {label} 17 | </Content> 18 | </Portal> 19 | </Root> 20 | </Provider> 21 | ); 22 | }; 23 | ``` -------------------------------------------------------------------------------- /docs/content/components/VSplitter.md: -------------------------------------------------------------------------------- ```markdown 1 | # VSplitter [#vsplitter] 2 | 3 | This component is inherited from [Splitter](/components/Splitter) 4 | 5 | See also: [HSplitter](/components/HSplitter) 6 | 7 | `VSplitter` is a specialized, shorthand version for the regular `Splitter` component with a vertical orientation. 8 | 9 | ```xmlui-pg copy display name="Example: VSplitter" 10 | <App> 11 | <VSplitter height="200px"> 12 | <Stack backgroundColor="lightblue" height="100%" /> 13 | <Stack backgroundColor="darksalmon" height="100%" /> 14 | </VSplitter> 15 | </App> 16 | ``` 17 | 18 | >[!INFO] 19 | > You cannot change the orientation of `VSplitter` from vertical to horizontal by setting the `orientation` prop, as the engine ignores that setting. 20 | 21 | 22 | ``` -------------------------------------------------------------------------------- /xmlui/src/components/NestedApp/Tooltip.tsx: -------------------------------------------------------------------------------- ```typescript 1 | import * as RadixTooltip from '@radix-ui/react-tooltip'; 2 | import styles from './Tooltip.module.scss'; 3 | 4 | type TooltipProps = { 5 | trigger: React.ReactNode; 6 | label: string; 7 | }; 8 | export const Tooltip = ({trigger, label}: TooltipProps) => { 9 | return ( 10 | <RadixTooltip.Provider> 11 | <RadixTooltip.Root> 12 | <RadixTooltip.Trigger asChild>{trigger}</RadixTooltip.Trigger> 13 | <RadixTooltip.Portal> 14 | <RadixTooltip.Content side="bottom" align="start" className={styles.TooltipContent}> 15 | {label} 16 | </RadixTooltip.Content> 17 | </RadixTooltip.Portal> 18 | </RadixTooltip.Root> 19 | </RadixTooltip.Provider> 20 | 21 | ) 22 | } ``` -------------------------------------------------------------------------------- /docs/content/components/HSplitter.md: -------------------------------------------------------------------------------- ```markdown 1 | # HSplitter [#hsplitter] 2 | 3 | This component is inherited from [Splitter](/components/Splitter) 4 | 5 | See also: [VSplitter](/components/VSplitter) 6 | 7 | `HSplitter` is a specialized, shorthand version for the regular `Splitter` component with a vertical orientation. 8 | 9 | ```xmlui-pg copy display name="Example: HSplitter" 10 | <App > 11 | <HSplitter height="200px"> 12 | <Stack backgroundColor="lightblue" height="100%" /> 13 | <Stack backgroundColor="darksalmon" height="100%" /> 14 | </HSplitter> 15 | </App> 16 | ``` 17 | 18 | >[!INFO] 19 | > You cannot change the orientation of `HSplitter` from vertical to horizontal by setting the `orientation` prop, as the engine ignores that setting. 20 | 21 | 22 | ``` -------------------------------------------------------------------------------- /xmlui/src/abstractions/scripting/LoopScope.ts: -------------------------------------------------------------------------------- ```typescript 1 | // Represents the scope of a loop 2 | export type LoopScope = { 3 | // Indicates that the current scope is a switch statement 4 | isSwitch?: boolean; 5 | 6 | // The label of the action to go to when a "continue" statement is executed in the loop 7 | continueLabel: number; 8 | 9 | // The label of the action to go to when a "break" statement is executed in the loop 10 | breakLabel: number; 11 | 12 | // The depth of continue block scopes at the start of the loop 13 | continueBlockDepth: number; 14 | 15 | // The depth of break block scopes at the start of the loop 16 | breakBlockDepth: number; 17 | 18 | // The depth of try blocks at the start of the loop 19 | tryBlockDepth: number; 20 | }; 21 | ``` -------------------------------------------------------------------------------- /xmlui/src/vite-env.d.ts: -------------------------------------------------------------------------------- ```typescript 1 | /// <reference types="vite/client" /> 2 | /// <reference types="vite-plugin-svgr/client" /> 3 | 4 | // Type declarations for XMLUI files 5 | declare module "*.xmlui" { 6 | interface XmluiModule { 7 | component: any; 8 | src: string; 9 | file: string; 10 | } 11 | const content: XmluiModule; 12 | export default content; 13 | } 14 | 15 | declare module "*.xmlui.xs" { 16 | interface XmluiCodeBehindModule { 17 | [key: string]: any; 18 | src: string; 19 | } 20 | const content: XmluiCodeBehindModule; 21 | export default content; 22 | } 23 | 24 | declare module "*.xs" { 25 | interface XmluiScriptModule { 26 | [key: string]: any; 27 | src: string; 28 | } 29 | const content: XmluiScriptModule; 30 | export default content; 31 | } 32 | ``` -------------------------------------------------------------------------------- /xmlui/src/components-core/rendering/InvalidComponent.module.scss: -------------------------------------------------------------------------------- ```scss 1 | @use "../theming/themes" as themes; 2 | 3 | .errorOverlay { 4 | background-color: rgba(255, 162, 162, 0.8); 5 | inset: 0; 6 | border-radius: 10px; 7 | padding: 8px; 8 | min-width: 200px; 9 | min-height: fit-content; 10 | } 11 | 12 | .title { 13 | span { 14 | background-color: themes.$color-danger-500; 15 | color: white; 16 | font-weight: themes.$fontWeight-normal; 17 | border-radius: 4px; 18 | padding-left: 4px; 19 | padding-right: 8px; 20 | } 21 | } 22 | 23 | .errorItems { 24 | list-style: disc; 25 | } 26 | 27 | .errorItem { 28 | background-color: themes.$color-danger-500; 29 | font-weight: themes.$fontWeight-bold; 30 | border-radius: 4px; 31 | padding-left: 8px; 32 | padding-right: 8px; 33 | margin-left: 18px; 34 | color: white; 35 | } ``` -------------------------------------------------------------------------------- /xmlui/src/testing/infrastructure/TestBed.tsx: -------------------------------------------------------------------------------- ```typescript 1 | // import { StandaloneApp } from ""; 2 | // import type { StandaloneAppDescription } from "xmlui"; 3 | import StandaloneApp from "../../../src/components-core/StandaloneApp"; 4 | import type { StandaloneAppDescription } from "../../../src/components-core/abstractions/standalone"; 5 | import "xmlui/index.scss"; 6 | 7 | declare global { 8 | interface Window { 9 | TEST_ENV: StandaloneAppDescription | undefined; 10 | } 11 | } 12 | 13 | function TestBed() { 14 | if (!window.TEST_ENV || !window.TEST_ENV) { 15 | return <div>Missing test env</div>; 16 | } 17 | return <StandaloneApp appDef={window.TEST_ENV} decorateComponentsWithTestId={true} waitForApiInterceptor={true}/>; 18 | } 19 | 20 | export default TestBed; 21 | ``` -------------------------------------------------------------------------------- /xmlui/dev-docs/index.md: -------------------------------------------------------------------------------- ```markdown 1 | # XMLUI Developer Guide 2 | 3 | This article helps you understand the implementation details of xmlui so that you can contribute to developing it. We suggest going through these documentation sections, following their order: 4 | 5 | - [XMLUI Rendering Fundamentals](./rendering-fundamentals.md) 6 | - [React Fundamentals](./react-fundamentals.md) 7 | - [Standalone Apps](./standalone-apps.md) 8 | - [`AppRoot`](./AppRoot.md) 9 | - ... 10 | - [Component Rendering](./component-rendering.md) 11 | - ... 12 | - [Helper Components](./helper-components) 13 | - [Accessibility](./accessibility.md) 14 | - [Component Review Checklist](./component-review-checklist.md) 15 | - [Glossary of Terms](./glossary.md/#some-other) 16 | ``` -------------------------------------------------------------------------------- /xmlui/scripts/generate-docs/input-handler.mjs: -------------------------------------------------------------------------------- ``` 1 | import { readFile } from "fs/promises"; 2 | import { ErrorWithSeverity, LOGGER_LEVELS } from "./logger.mjs"; 3 | import { ERROR_MESSAGES } from "./constants.mjs"; 4 | import { configManager } from "./configuration-management.mjs"; 5 | 6 | // Backward compatibility wrapper - delegates to enhanced configuration manager 7 | export default async function loadConfig(configPath) { 8 | return await configManager.loadConfig(configPath, null, { 9 | transform: (rawConfig) => { 10 | const { excludeComponentStatuses, ...data } = rawConfig; 11 | return { 12 | excludeComponentStatuses: excludeComponentStatuses?.map(status => status.toLowerCase()) || [], 13 | ...data, 14 | }; 15 | } 16 | }); 17 | } 18 | ``` -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "editor.tabSize": 2, 3 | // "prettier.configPath": ".prettierrc.js", 4 | "[html]": { 5 | "editor.defaultFormatter": "vscode.html-language-features" 6 | }, 7 | "[typescriptreact]": { 8 | "editor.defaultFormatter": "esbenp.prettier-vscode" 9 | }, 10 | "[typescript]": { 11 | "editor.defaultFormatter": "esbenp.prettier-vscode" 12 | }, 13 | "[json]": { 14 | "editor.defaultFormatter": "esbenp.prettier-vscode" 15 | }, 16 | "[mdx]": { 17 | "editor.defaultFormatter": "unifiedjs.vscode-mdx" 18 | }, 19 | "[javascript]": { 20 | "editor.defaultFormatter": "esbenp.prettier-vscode" 21 | }, 22 | "editor.tokenColorCustomizations": { 23 | "[Material Theme Darker High Contrast]": { 24 | "comments": "#2aa034" 25 | } 26 | } 27 | } ``` -------------------------------------------------------------------------------- /packages/xmlui-animations/tsconfig.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "compilerOptions": { 3 | "target": "es2015", 4 | "lib": [ 5 | "dom", 6 | "dom.iterable", 7 | "esnext" 8 | ], 9 | "allowJs": true, 10 | "skipLibCheck": true, 11 | "esModuleInterop": true, 12 | "types": ["vite/client", "vite-plugin-svgr/client", "node"], 13 | "allowSyntheticDefaultImports": true, 14 | "strict": true, 15 | "forceConsistentCasingInFileNames": true, 16 | "noFallthroughCasesInSwitch": true, 17 | "module": "esnext", 18 | "moduleResolution": "node", 19 | "resolveJsonModule": true, 20 | "isolatedModules": true, 21 | "noEmit": true, 22 | "jsx": "react-jsx" 23 | }, 24 | "include": [ 25 | "demo", 26 | "src", 27 | "index.ts" 28 | ], 29 | "exclude": [ 30 | "demo/**/*.xmlui.xs" 31 | ] 32 | } 33 | ``` -------------------------------------------------------------------------------- /packages/xmlui-devtools/tsconfig.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "compilerOptions": { 3 | "target": "es2015", 4 | "lib": [ 5 | "dom", 6 | "dom.iterable", 7 | "esnext" 8 | ], 9 | "allowJs": true, 10 | "skipLibCheck": true, 11 | "esModuleInterop": true, 12 | "types": ["vite/client", "vite-plugin-svgr/client", "node"], 13 | "allowSyntheticDefaultImports": true, 14 | "strict": true, 15 | "forceConsistentCasingInFileNames": true, 16 | "noFallthroughCasesInSwitch": true, 17 | "module": "esnext", 18 | "moduleResolution": "node", 19 | "resolveJsonModule": true, 20 | "isolatedModules": true, 21 | "noEmit": true, 22 | "jsx": "react-jsx" 23 | }, 24 | "include": [ 25 | "demo", 26 | "src", 27 | "index.ts" 28 | ], 29 | "exclude": [ 30 | "demo/**/*.xmlui.xs" 31 | ] 32 | } 33 | ``` -------------------------------------------------------------------------------- /packages/xmlui-hello-world/tsconfig.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "compilerOptions": { 3 | "target": "es2015", 4 | "lib": [ 5 | "dom", 6 | "dom.iterable", 7 | "esnext" 8 | ], 9 | "allowJs": true, 10 | "skipLibCheck": true, 11 | "esModuleInterop": true, 12 | "types": ["vite/client", "vite-plugin-svgr/client", "node"], 13 | "allowSyntheticDefaultImports": true, 14 | "strict": true, 15 | "forceConsistentCasingInFileNames": true, 16 | "noFallthroughCasesInSwitch": true, 17 | "module": "esnext", 18 | "moduleResolution": "node", 19 | "resolveJsonModule": true, 20 | "isolatedModules": true, 21 | "noEmit": true, 22 | "jsx": "react-jsx" 23 | }, 24 | "include": [ 25 | "demo", 26 | "src", 27 | "index.ts" 28 | ], 29 | "exclude": [ 30 | "demo/**/*.xmlui.xs" 31 | ] 32 | } 33 | ``` -------------------------------------------------------------------------------- /packages/xmlui-os-frames/tsconfig.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "compilerOptions": { 3 | "target": "es2015", 4 | "lib": [ 5 | "dom", 6 | "dom.iterable", 7 | "esnext" 8 | ], 9 | "allowJs": true, 10 | "skipLibCheck": true, 11 | "esModuleInterop": true, 12 | "types": ["vite/client", "vite-plugin-svgr/client", "node"], 13 | "allowSyntheticDefaultImports": true, 14 | "strict": true, 15 | "forceConsistentCasingInFileNames": true, 16 | "noFallthroughCasesInSwitch": true, 17 | "module": "esnext", 18 | "moduleResolution": "node", 19 | "resolveJsonModule": true, 20 | "isolatedModules": true, 21 | "noEmit": true, 22 | "jsx": "react-jsx" 23 | }, 24 | "include": [ 25 | "demo", 26 | "src", 27 | "index.ts" 28 | ], 29 | "exclude": [ 30 | "demo/**/*.xmlui.xs" 31 | ] 32 | } 33 | ``` -------------------------------------------------------------------------------- /packages/xmlui-pdf/tsconfig.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "compilerOptions": { 3 | "target": "es2015", 4 | "lib": [ 5 | "dom", 6 | "dom.iterable", 7 | "esnext" 8 | ], 9 | "allowJs": true, 10 | "skipLibCheck": true, 11 | "esModuleInterop": true, 12 | "types": ["vite/client", "vite-plugin-svgr/client", "node"], 13 | "allowSyntheticDefaultImports": true, 14 | "strict": true, 15 | "forceConsistentCasingInFileNames": true, 16 | "noFallthroughCasesInSwitch": true, 17 | "module": "esnext", 18 | "moduleResolution": "node", 19 | "resolveJsonModule": true, 20 | "isolatedModules": true, 21 | "noEmit": true, 22 | "jsx": "react-jsx" 23 | }, 24 | "include": [ 25 | "demo", 26 | "src", 27 | "index.ts" 28 | ], 29 | "exclude": [ 30 | "demo/**/*.xmlui.xs" 31 | ] 32 | } 33 | ``` -------------------------------------------------------------------------------- /packages/xmlui-playground/tsconfig.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "compilerOptions": { 3 | "target": "es2015", 4 | "lib": [ 5 | "dom", 6 | "dom.iterable", 7 | "esnext" 8 | ], 9 | "allowJs": true, 10 | "skipLibCheck": true, 11 | "esModuleInterop": true, 12 | "types": ["vite/client", "vite-plugin-svgr/client", "node"], 13 | "allowSyntheticDefaultImports": true, 14 | "strict": true, 15 | "forceConsistentCasingInFileNames": true, 16 | "noFallthroughCasesInSwitch": true, 17 | "module": "esnext", 18 | "moduleResolution": "node", 19 | "resolveJsonModule": true, 20 | "isolatedModules": true, 21 | "noEmit": true, 22 | "jsx": "react-jsx" 23 | }, 24 | "include": [ 25 | "demo", 26 | "src", 27 | "index.ts" 28 | ], 29 | "exclude": [ 30 | "demo/**/*.xmlui.xs" 31 | ] 32 | } 33 | ``` -------------------------------------------------------------------------------- /packages/xmlui-search/tsconfig.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "compilerOptions": { 3 | "target": "es2015", 4 | "lib": [ 5 | "dom", 6 | "dom.iterable", 7 | "esnext" 8 | ], 9 | "allowJs": true, 10 | "skipLibCheck": true, 11 | "esModuleInterop": true, 12 | "types": ["vite/client", "vite-plugin-svgr/client", "node"], 13 | "allowSyntheticDefaultImports": true, 14 | "strict": true, 15 | "forceConsistentCasingInFileNames": true, 16 | "noFallthroughCasesInSwitch": true, 17 | "module": "esnext", 18 | "moduleResolution": "node", 19 | "resolveJsonModule": true, 20 | "isolatedModules": true, 21 | "noEmit": true, 22 | "jsx": "react-jsx" 23 | }, 24 | "include": [ 25 | "demo", 26 | "src", 27 | "index.ts" 28 | ], 29 | "exclude": [ 30 | "demo/**/*.xmlui.xs" 31 | ] 32 | } 33 | ``` -------------------------------------------------------------------------------- /packages/xmlui-spreadsheet/tsconfig.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "compilerOptions": { 3 | "target": "es2015", 4 | "lib": [ 5 | "dom", 6 | "dom.iterable", 7 | "esnext" 8 | ], 9 | "allowJs": true, 10 | "skipLibCheck": true, 11 | "esModuleInterop": true, 12 | "types": ["vite/client", "vite-plugin-svgr/client", "node"], 13 | "allowSyntheticDefaultImports": true, 14 | "strict": true, 15 | "forceConsistentCasingInFileNames": true, 16 | "noFallthroughCasesInSwitch": true, 17 | "module": "esnext", 18 | "moduleResolution": "node", 19 | "resolveJsonModule": true, 20 | "isolatedModules": true, 21 | "noEmit": true, 22 | "jsx": "react-jsx" 23 | }, 24 | "include": [ 25 | "demo", 26 | "src", 27 | "index.ts" 28 | ], 29 | "exclude": [ 30 | "demo/**/*.xmlui.xs" 31 | ] 32 | } 33 | ``` -------------------------------------------------------------------------------- /packages/xmlui-website-blocks/tsconfig.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "compilerOptions": { 3 | "target": "es2015", 4 | "lib": [ 5 | "dom", 6 | "dom.iterable", 7 | "esnext" 8 | ], 9 | "allowJs": true, 10 | "skipLibCheck": true, 11 | "esModuleInterop": true, 12 | "types": ["vite/client", "vite-plugin-svgr/client", "node"], 13 | "allowSyntheticDefaultImports": true, 14 | "strict": true, 15 | "forceConsistentCasingInFileNames": true, 16 | "noFallthroughCasesInSwitch": true, 17 | "module": "esnext", 18 | "moduleResolution": "node", 19 | "resolveJsonModule": true, 20 | "isolatedModules": true, 21 | "noEmit": true, 22 | "jsx": "react-jsx" 23 | }, 24 | "include": [ 25 | "demo", 26 | "src", 27 | "index.ts" 28 | ], 29 | "exclude": [ 30 | "demo/**/*.xmlui.xs" 31 | ] 32 | } 33 | ``` -------------------------------------------------------------------------------- /xmlui/src/components/Charts/PieChart/PieChartNative.module.scss: -------------------------------------------------------------------------------- ```scss 1 | @use "xmlui/themes.scss" as t; 2 | 3 | // --- This code snippet is required to collect the theme variables used in this module 4 | $themeVars: (); 5 | @function createThemeVar($componentVariable) { 6 | $themeVars: t.appendThemeVar($themeVars, $componentVariable) !global; 7 | @return t.getThemeVar($themeVars, $componentVariable); 8 | } 9 | 10 | $componentName: "PieChart"; 11 | 12 | @layer components { 13 | 14 | .wrapper{ 15 | width: 100%; 16 | height: 100%; 17 | flex: 1; 18 | min-height: 0; 19 | } 20 | .chartContainer { 21 | margin-left: auto; 22 | margin-right: auto; 23 | aspect-ratio: 1 / 1; 24 | } 25 | } 26 | 27 | // --- We export the theme variables to add them to the component renderer 28 | :export { 29 | themeVars: t.json-stringify($themeVars); 30 | } 31 | ``` -------------------------------------------------------------------------------- /xmlui/src/components/FormItem/HelperText.module.scss: -------------------------------------------------------------------------------- ```scss 1 | @use "../../components-core/theming/themes" as t; 2 | 3 | @layer components { 4 | .helper { 5 | padding-top: t.$space-1; 6 | padding-bottom: t.$space-1; 7 | display: flex; 8 | align-items: center; 9 | user-select: none; 10 | -moz-user-select: none; 11 | -webkit-user-select: none; 12 | -ms-user-select: none; 13 | } 14 | 15 | .helperText { 16 | font-size: t.$fontSize-sm; 17 | color: t.$textColor-primary; 18 | } 19 | 20 | .valid { 21 | .helperText { 22 | margin-left: 0.25em; 23 | color: t.$color-valid; 24 | } 25 | } 26 | 27 | .error { 28 | .helperText { 29 | margin-left: 0.25em; 30 | color: t.$color-error; 31 | } 32 | } 33 | 34 | .warning { 35 | .helperText { 36 | margin-left: 0.25em; 37 | color: t.$color-warning; 38 | } 39 | } 40 | 41 | } 42 | 43 | ``` -------------------------------------------------------------------------------- /blog/tsconfig.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "compilerOptions": { 3 | "target": "es2017", 4 | "lib": [ 5 | "dom", 6 | "dom.iterable", 7 | "esnext" 8 | ], 9 | "allowJs": true, 10 | "skipLibCheck": true, 11 | "esModuleInterop": true, 12 | "types": ["vite/client", "node"], 13 | "allowSyntheticDefaultImports": true, 14 | "strict": true, 15 | "forceConsistentCasingInFileNames": true, 16 | "noFallthroughCasesInSwitch": true, 17 | "module": "esnext", 18 | "moduleResolution": "node", 19 | "resolveJsonModule": true, 20 | "isolatedModules": true, 21 | "noEmit": true, 22 | "jsx": "react-jsx", 23 | "paths": { 24 | "@components/*": ["../ui-engine/src/components/*"], 25 | } 26 | }, 27 | "include": [ 28 | "src", 29 | "build", 30 | "index.ts" 31 | ] 32 | } 33 | ``` -------------------------------------------------------------------------------- /docs/tsconfig.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "compilerOptions": { 3 | "target": "es2017", 4 | "lib": [ 5 | "dom", 6 | "dom.iterable", 7 | "esnext" 8 | ], 9 | "allowJs": true, 10 | "skipLibCheck": true, 11 | "esModuleInterop": true, 12 | "types": ["vite/client", "node"], 13 | "allowSyntheticDefaultImports": true, 14 | "strict": true, 15 | "forceConsistentCasingInFileNames": true, 16 | "noFallthroughCasesInSwitch": true, 17 | "module": "esnext", 18 | "moduleResolution": "node", 19 | "resolveJsonModule": true, 20 | "isolatedModules": true, 21 | "noEmit": true, 22 | "jsx": "react-jsx", 23 | "paths": { 24 | "@components/*": ["../ui-engine/src/components/*"], 25 | } 26 | }, 27 | "include": [ 28 | "src", 29 | "build", 30 | "index.ts" 31 | ] 32 | } 33 | ``` -------------------------------------------------------------------------------- /xmlui/src/components/Breakout/Breakout.tsx: -------------------------------------------------------------------------------- ```typescript 1 | import { createComponentRenderer } from "../../components-core/renderers"; 2 | import { createMetadata } from "../metadata-helpers"; 3 | import { Breakout } from "./BreakoutNative"; 4 | 5 | const COMP = "Breakout"; 6 | 7 | export const BreakoutMd = createMetadata({ 8 | status: "stable", 9 | description: 10 | `The \`${COMP}\` component creates a breakout section. It allows its child to ` + 11 | `occupy the entire width of the UI even if the app or the parent container constrains ` + 12 | `the maximum content width.`, 13 | }); 14 | 15 | export const breakoutComponentRenderer = createComponentRenderer( 16 | COMP, 17 | BreakoutMd, 18 | ({ node, renderChild }) => { 19 | return <Breakout>{renderChild(node.children)}</Breakout>; 20 | }, 21 | ); 22 | ``` -------------------------------------------------------------------------------- /packages/xmlui-spreadsheet/src/Spreadsheet.tsx: -------------------------------------------------------------------------------- ```typescript 1 | import { createComponentRenderer, createMetadata, parseScssVar } from "xmlui"; 2 | import JSpreadsheet from "./SpreadsheetNative"; 3 | 4 | const COMP = "Spreadsheet"; 5 | 6 | export const SpreadsheetMd = createMetadata({ 7 | description: "XMLUI Spreadsheet", 8 | status: "experimental", 9 | props: { 10 | worksheets: { 11 | description: "This property sets the initial value of the spreadsheet's worksheets.", 12 | }, 13 | }, 14 | themeVars: parseScssVar({}), 15 | defaultThemeVars: {}, 16 | }); 17 | 18 | export const spreadsheetComponentRenderer = createComponentRenderer( 19 | COMP, 20 | SpreadsheetMd, 21 | ({ extractValue, node, renderChild }: any) => { 22 | return <JSpreadsheet worksheets={extractValue(node.props.worksheets)} />; 23 | }, 24 | ); 25 | ``` -------------------------------------------------------------------------------- /xmlui/src/components/HoverCard/HovercardNative.tsx: -------------------------------------------------------------------------------- ```typescript 1 | import type React from "react"; 2 | import * as HoverCard from "@radix-ui/react-hover-card"; 3 | 4 | import { useTheme } from "../../components-core/theming/ThemeContext"; 5 | 6 | type Props = { 7 | triggerTemplate: React.ReactNode; 8 | children: React.ReactNode; 9 | }; 10 | 11 | export const HoverCardComponent = ({ triggerTemplate, children }: Props) => { 12 | const { root } = useTheme(); 13 | return ( 14 | <HoverCard.Root openDelay={100} closeDelay={100}> 15 | <HoverCard.Trigger>{triggerTemplate}</HoverCard.Trigger> 16 | <HoverCard.Portal container={root}> 17 | <HoverCard.Content side="bottom" sideOffset={5}> 18 | {children} 19 | </HoverCard.Content> 20 | </HoverCard.Portal> 21 | </HoverCard.Root> 22 | ); 23 | }; 24 | ``` -------------------------------------------------------------------------------- /docs/public/pages/xmlui-charts/Legend.md: -------------------------------------------------------------------------------- ```markdown 1 | # Legend [#legend] 2 | 3 | >[!WARNING] 4 | > This component is in an **experimental** state; you can use it in your app. However, we may modify it, and it may even have breaking changes in the future.Legend component to be displayed in a chart component. 5 | 6 | ## Properties 7 | 8 | ### `align (default: "center")` 9 | 10 | The alignment of the legend 11 | 12 | Available values: `left`, `right`, `center` **(default)** 13 | 14 | ### `verticalAlign (default: "bottom")` 15 | 16 | The vertical alignment of the legend 17 | 18 | Available values: `top`, `bottom` **(default)**, `middle` 19 | 20 | ## Events 21 | 22 | This component does not have any events. 23 | 24 | ## Exposed Methods 25 | 26 | This component does not expose any methods. 27 | 28 | ## Styling 29 | 30 | This component does not have any styles. 31 | ``` -------------------------------------------------------------------------------- /xmlui/src/components/InspectButton/InspectButton.module.scss: -------------------------------------------------------------------------------- ```scss 1 | @use "../../components-core/theming/themes" as t; 2 | 3 | // --- This code snippet is required to collect the theme variables used in this module 4 | $themeVars: (); 5 | @function createThemeVar($componentVariable) { 6 | $themeVars: t.appendThemeVar($themeVars, $componentVariable) !global; 7 | @return t.getThemeVar($themeVars, $componentVariable); 8 | } 9 | 10 | @layer components { 11 | .icon { 12 | font-size: t.$fontSize-base; 13 | } 14 | 15 | .inspectButton { 16 | display: flex; 17 | gap: t.$space-1; 18 | justify-content: center; 19 | } 20 | 21 | .active { 22 | background: t.$color-primary-500; 23 | } 24 | 25 | // --- We export the theme variables to add them to the component renderer 26 | :export { 27 | themeVars: t.json-stringify($themeVars); 28 | } 29 | } 30 | ``` -------------------------------------------------------------------------------- /xmlui/src/components/Icon/svg/api.svg: -------------------------------------------------------------------------------- ``` 1 | <svg width="24" height="25" viewBox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg"> 2 | <path d="M12 8.5C16.9706 8.5 21 7.15685 21 5.5C21 3.84315 16.9706 2.5 12 2.5C7.02944 2.5 3 3.84315 3 5.5C3 7.15685 7.02944 8.5 12 8.5Z" 3 | stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> 4 | <path d="M21 12.5C21 14.16 17 15.5 12 15.5C7 15.5 3 14.16 3 12.5" stroke="currentColor" stroke-width="1.5" 5 | stroke-linecap="round" stroke-linejoin="round"/> 6 | <path d="M3 5.5V19.5C3 21.16 7 22.5 12 22.5C17 22.5 21 21.16 21 19.5V5.5" stroke="currentColor" stroke-width="1.5" 7 | stroke-linecap="round" stroke-linejoin="round"/> 8 | </svg> 9 | ``` -------------------------------------------------------------------------------- /xmlui/src/components/Input/InputLabel.tsx: -------------------------------------------------------------------------------- ```typescript 1 | import classnames from "classnames"; 2 | 3 | import styles from "./InputLabel.module.scss"; 4 | 5 | // ===================================================================================================================== 6 | // React component definition 7 | 8 | type Props = { 9 | text: string; 10 | forFieldId?: string; 11 | required?: boolean; 12 | disabled?: boolean; 13 | focused?: boolean; 14 | }; 15 | 16 | export const InputLabel = ({ text, required, forFieldId, disabled, ...rest }: Props) => { 17 | return ( 18 | <label 19 | {...rest} 20 | className={classnames(styles.inputLabel, { [styles.disabled]: disabled })} 21 | htmlFor={forFieldId} 22 | > 23 | {text} {required && <span className={styles.required}>*</span>} 24 | </label> 25 | ); 26 | }; 27 | ``` -------------------------------------------------------------------------------- /packages/xmlui-pdf/src/Pdf.module.scss: -------------------------------------------------------------------------------- ```scss 1 | @use "xmlui/themes.scss" as t; 2 | 3 | // --- This code snippet is required to collect the theme variables used in this module 4 | $themeVars: (); 5 | @function createThemeVar($componentVariable) { 6 | $themeVars: t.appendThemeVar($themeVars, $componentVariable) !global; 7 | @return t.getThemeVar($themeVars, $componentVariable); 8 | } 9 | 10 | $boxShadow-page-Pdf: createThemeVar("boxShadow-page-Pdf"); 11 | $gap-pages-Pdf: createThemeVar("gap-pages-Pdf"); 12 | 13 | .document{ 14 | display: flex; 15 | flex-direction: column; 16 | gap: $gap-pages-Pdf; 17 | width: fit-content; 18 | } 19 | 20 | .page{ 21 | box-shadow: $boxShadow-page-Pdf; 22 | } 23 | 24 | // --- We export the theme variables to add them to the component renderer 25 | :export{ 26 | themeVars: t.json-stringify($themeVars) 27 | } ``` -------------------------------------------------------------------------------- /xmlui/src/components-core/theming/ThemeContext.tsx: -------------------------------------------------------------------------------- ```typescript 1 | import React, { useContext } from "react"; 2 | import type { AppThemes, ThemeScope } from "../../abstractions/ThemingDefs"; 3 | 4 | export const ThemeContext = React.createContext<ThemeScope | undefined>(undefined); 5 | export const ThemesContext = React.createContext<AppThemes | undefined>(undefined); 6 | 7 | // This React hook makes the current theme information available within any component logic using the hook. 8 | export function useTheme(): ThemeScope { 9 | return useContext(ThemeContext)!; 10 | } 11 | 12 | export function useThemes(): AppThemes { 13 | return useContext(ThemesContext)!; 14 | } 15 | 16 | export function useResourceUrl(resourceString?: string) { 17 | const { getResourceUrl } = useTheme(); 18 | return getResourceUrl(resourceString); 19 | } 20 | ``` -------------------------------------------------------------------------------- /xmlui/src/components/Column/TableContext.tsx: -------------------------------------------------------------------------------- ```typescript 1 | import type { CSSProperties, ReactNode } from "react"; 2 | import { createContext, useContext } from "react"; 3 | 4 | export type OurColumnMetadata = { 5 | style?: CSSProperties; 6 | className?: string; 7 | header: string; 8 | accessorKey?: string; 9 | id?: string; 10 | size?: number; 11 | width?: string; 12 | minWidth?: number; 13 | maxWidth?: number; 14 | canSort?: boolean; 15 | pinTo?: string; 16 | canResize?: boolean; 17 | cellRenderer?: (row: any, rowIndex: number, colIndex: number, value: any) => ReactNode; 18 | }; 19 | 20 | export const TableContext = createContext({ 21 | registerColumn: (col: OurColumnMetadata, id: string) => {}, 22 | unRegisterColumn: (id: string) => {}, 23 | }); 24 | 25 | export function useTableContext() { 26 | return useContext(TableContext); 27 | } 28 | ``` -------------------------------------------------------------------------------- /xmlui/tsconfig.bin.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "compilerOptions": { 3 | "target": "es2015", 4 | "lib": [ 5 | "dom", 6 | "dom.iterable", 7 | "esnext" 8 | ], 9 | "allowJs": true, 10 | "skipLibCheck": true, 11 | "esModuleInterop": true, 12 | "allowSyntheticDefaultImports": true, 13 | "strict": true, 14 | "strictNullChecks": false, 15 | "noImplicitAny": false, 16 | "forceConsistentCasingInFileNames": true, 17 | "noFallthroughCasesInSwitch": true, 18 | "module": "CommonJS", 19 | "moduleResolution": "node", 20 | "resolveJsonModule": true, 21 | "isolatedModules": true, 22 | "noEmit": false, 23 | "jsx": "react-jsx", 24 | "outDir": "dist/scripts", 25 | "types": ["vite/client", "vite-plugin-svgr/client", "node"] 26 | }, 27 | "include": [ 28 | "bin", 29 | "src" 30 | ] 31 | } ``` -------------------------------------------------------------------------------- /xmlui/src/parsers/xmlui-parser/xmlui-tree.ts: -------------------------------------------------------------------------------- ```typescript 1 | export type XmlUiNode = XmlUiComment | XmlUiAttribute | XmlUiElement; 2 | 3 | export type XmlUiFragment = XmlUiNode | XmlUiNode[]; 4 | 5 | export interface XmlUiNodeBase { 6 | type: XmlUiNode["type"]; 7 | } 8 | 9 | export interface XmlUiComment extends XmlUiNodeBase { 10 | type: "XmlUiComment"; 11 | text?: string; 12 | } 13 | 14 | export interface XmlUiAttribute extends XmlUiNodeBase { 15 | type: "XmlUiAttribute"; 16 | name: string; 17 | namespace?: string; 18 | value?: string; 19 | preserveQuotes?: boolean; 20 | preserveSpaces?: boolean; 21 | } 22 | 23 | export interface XmlUiElement extends XmlUiNodeBase { 24 | type: "XmlUiElement"; 25 | name: string; 26 | namespace?: string; 27 | attributes?: XmlUiAttribute[]; 28 | text?: string; 29 | preserveSpaces?: boolean; 30 | childNodes?: XmlUiNode[]; 31 | } 32 | ``` -------------------------------------------------------------------------------- /packages/xmlui-devtools/src/devtools/Tooltip.tsx: -------------------------------------------------------------------------------- ```typescript 1 | import { Provider, Root, Portal, Trigger, Content } from "@radix-ui/react-tooltip"; 2 | import React, { ReactNode } from "react"; 3 | import { useTheme } from "xmlui"; 4 | import styles from "./Tooltip.module.scss"; 5 | 6 | export const Tooltip = React.forwardRef(function ( 7 | { 8 | children, 9 | label, 10 | }: { 11 | children: ReactNode; 12 | label: string; 13 | }, 14 | ref: React.Ref<HTMLButtonElement>, 15 | ) { 16 | const { root } = useTheme(); 17 | return ( 18 | <Provider> 19 | <Root> 20 | <Trigger ref={ref} asChild>{children}</Trigger> 21 | <Portal container={root}> 22 | <Content className={styles.TooltipContent} sideOffset={5}> 23 | {label} 24 | </Content> 25 | </Portal> 26 | </Root> 27 | </Provider> 28 | ); 29 | }); 30 | ``` -------------------------------------------------------------------------------- /docs/content/components/H1.md: -------------------------------------------------------------------------------- ```markdown 1 | # H1 [#h1] 2 | 3 | This component is inherited from [Heading](/components/Heading) 4 | 5 | See also: [H2](/components/H2), [H3](/components/H3), [H4](/components/H4), [H5](/components/H5), [H6](/components/H6) 6 | 7 | The `H1` component is a shorthand version of the `Heading` element with its `level` property set to "h1". 8 | 9 | ```xmlui-pg copy display name="H1 example" 10 | <App> 11 | <H1 value="This is a H1 text" /> 12 | </App> 13 | ``` 14 | 15 | ## Styling [#styling] 16 | 17 | The `H1` component inherits its visual style from the `Heading` component. 18 | Using the `H1` component specifier, you can override the inherited theme variable values. 19 | For example, the `textColor-H1` theme variable sets the text color of `H1` while keeping the color of all other headings. 20 | 21 | 22 | ``` -------------------------------------------------------------------------------- /docs/content/components/H2.md: -------------------------------------------------------------------------------- ```markdown 1 | # H2 [#h2] 2 | 3 | This component is inherited from [Heading](/components/Heading) 4 | 5 | See also: [H1](/components/H1), [H3](/components/H3), [H4](/components/H4), [H5](/components/H5), [H6](/components/H6) 6 | 7 | The `H2` component is a shorthand version of the `Heading` element with its `level` property set to "h2". 8 | 9 | ```xmlui-pg copy display name="H2 example" 10 | <App> 11 | <H2 value="This is a H2 text" /> 12 | </App> 13 | ``` 14 | 15 | ## Styling [#styling] 16 | 17 | The `H2` component inherits its visual style from the `Heading` component. 18 | Using the `H2` component specifier, you can override the inherited theme variable values. 19 | For example, the `textColor-H2` theme variable sets the text color of `H2` while keeping the color of all other headings. 20 | 21 | 22 | ``` -------------------------------------------------------------------------------- /docs/content/components/H3.md: -------------------------------------------------------------------------------- ```markdown 1 | # H3 [#h3] 2 | 3 | This component is inherited from [Heading](/components/Heading) 4 | 5 | See also: [H1](/components/H1), [H2](/components/H2), [H4](/components/H4), [H5](/components/H5), [H6](/components/H6) 6 | 7 | The `H3` component is a shorthand version of the `Heading` element with its `level` property set to "h3". 8 | 9 | ```xmlui-pg copy display name="H3 example" 10 | <App> 11 | <H3 value="This is a H3 text" /> 12 | </App> 13 | ``` 14 | 15 | ## Styling [#styling] 16 | 17 | The `H3` component inherits its visual style from the `Heading` component. 18 | Using the `H3` component specifier, you can override the inherited theme variable values. 19 | For example, the `textColor-H3` theme variable sets the text color of `H3` while keeping the color of all other headings. 20 | 21 | 22 | ``` -------------------------------------------------------------------------------- /docs/content/components/H4.md: -------------------------------------------------------------------------------- ```markdown 1 | # H4 [#h4] 2 | 3 | This component is inherited from [Heading](/components/Heading) 4 | 5 | See also: [H1](/components/H1), [H2](/components/H2), [H3](/components/H3), [H5](/components/H5), [H6](/components/H6) 6 | 7 | The `H4` component is a shorthand version of the `Heading` element with its `level` property set to "h4". 8 | 9 | ```xmlui-pg copy display name="H4 example" 10 | <App> 11 | <H4 value="This is a H4 text" /> 12 | </App> 13 | ``` 14 | 15 | ## Styling [#styling] 16 | 17 | The `H4` component inherits its visual style from the `Heading` component. 18 | Using the `H4` component specifier, you can override the inherited theme variable values. 19 | For example, the `textColor-H4` theme variable sets the text color of `H4` while keeping the color of all other headings. 20 | 21 | 22 | ``` -------------------------------------------------------------------------------- /docs/content/components/H5.md: -------------------------------------------------------------------------------- ```markdown 1 | # H5 [#h5] 2 | 3 | This component is inherited from [Heading](/components/Heading) 4 | 5 | See also: [H1](/components/H1), [H2](/components/H2), [H3](/components/H3), [H4](/components/H4), [H6](/components/H6) 6 | 7 | The `H5` component is a shorthand version of the `Heading` element with its `level` property set to "h5". 8 | 9 | ```xmlui-pg copy display name="H5 example" 10 | <App> 11 | <H5 value="This is a H5 text" /> 12 | </App> 13 | ``` 14 | 15 | ## Styling [#styling] 16 | 17 | The `H5` component inherits its visual style from the `Heading` component. 18 | Using the `H5` component specifier, you can override the inherited theme variable values. 19 | For example, the `textColor-H5` theme variable sets the text color of `H5` while keeping the color of all other headings. 20 | 21 | 22 | ``` -------------------------------------------------------------------------------- /docs/content/components/H6.md: -------------------------------------------------------------------------------- ```markdown 1 | # H6 [#h6] 2 | 3 | This component is inherited from [Heading](/components/Heading) 4 | 5 | See also: [H1](/components/H1), [H2](/components/H2), [H3](/components/H3), [H4](/components/H4), [H5](/components/H5) 6 | 7 | The `H6` component is a shorthand version of the `Heading` element with its `level` property set to "h6". 8 | 9 | ```xmlui-pg copy display name="H6 example" 10 | <App> 11 | <H6 value="This is a H6 text" /> 12 | </App> 13 | ``` 14 | 15 | ## Styling [#styling] 16 | 17 | The `H6` component inherits its visual style from the `Heading` component. 18 | Using the `H6` component specifier, you can override the inherited theme variable values. 19 | For example, the `textColor-H6` theme variable sets the text color of `H6` while keeping the color of all other headings. 20 | 21 | 22 | ``` -------------------------------------------------------------------------------- /xmlui/src/components/Option/OptionNative.tsx: -------------------------------------------------------------------------------- ```typescript 1 | import { memo } from "react"; 2 | import type { Option } from "../abstractions"; 3 | import { useOptionType } from "./OptionTypeProvider"; 4 | 5 | // Default props for Option component 6 | export const defaultProps = { 7 | enabled: true, 8 | }; 9 | 10 | export function convertOptionValue(value: any): any { 11 | if ( 12 | typeof value !== "string" && 13 | (typeof value !== "number" || 14 | (typeof value === "number" && isNaN(value))) && 15 | typeof value !== "boolean" && 16 | value !== null 17 | ) { 18 | return ""; 19 | } 20 | return value; 21 | } 22 | 23 | export const OptionNative = memo((props: Option) => { 24 | const OptionType = useOptionType(); 25 | if (!OptionType) { 26 | return null; 27 | } 28 | return <OptionType {...props} />; 29 | }); 30 | OptionNative.displayName = "OptionNative"; 31 | ``` -------------------------------------------------------------------------------- /xmlui/src/language-server/services/diagnostic.ts: -------------------------------------------------------------------------------- ```typescript 1 | import type { Diagnostic, Position } from "vscode-languageserver"; 2 | import type { Error, ParseResult } from "../../parsers/xmlui-parser"; 3 | import { offsetToPosRange } from "./common/lsp-utils"; 4 | 5 | export type DiagnosticsContext = { 6 | offsetToPos: (pos: number) => Position; 7 | parseResult: ParseResult; 8 | } 9 | 10 | 11 | export function getDiagnostics(ctx: DiagnosticsContext): Diagnostic[] { 12 | const { errors } = ctx.parseResult; 13 | 14 | return errors.map((e) => { 15 | return errorToLspDiag(e, ctx.offsetToPos); 16 | }); 17 | } 18 | 19 | export function errorToLspDiag(e: Error, offsetToPos: (number) => Position): Diagnostic{ 20 | return { 21 | severity: e.category, 22 | range: offsetToPosRange(offsetToPos, e), 23 | message: e.message, 24 | code: e.code, 25 | } 26 | } 27 | ``` -------------------------------------------------------------------------------- /xmlui/src/parsers/style-parser/tokens.ts: -------------------------------------------------------------------------------- ```typescript 1 | // Token types used in layout parsing 2 | export const enum StyleTokenType { 3 | Eof = -1, 4 | Ws = -2, 5 | Unknown = 0, 6 | 7 | // --- Binding Expression specific tokens 8 | Identifier, 9 | Star, 10 | Percentage, 11 | Number, 12 | 13 | LParent, 14 | RParent, 15 | Comma, 16 | Slash, 17 | 18 | Reset, 19 | None, 20 | UserSelect, 21 | SizeUnit, 22 | FitToContent, 23 | Auto, 24 | Alignment, 25 | TextAlignment, 26 | BorderStyle, 27 | Scrolling, 28 | TextTransform, 29 | Direction, 30 | Angle, 31 | HexaColor, 32 | ColorFunc, 33 | FontFamily, 34 | ColorName, 35 | FontWeight, 36 | DecorationLine, 37 | Orientation, 38 | Cursor, 39 | Default, 40 | Boolean, 41 | String 42 | } 43 | 44 | // Represents a generic token 45 | export type StyleToken = { 46 | readonly text: string; 47 | readonly type: StyleTokenType; 48 | readonly start: number; 49 | readonly end: number; 50 | }; 51 | ``` -------------------------------------------------------------------------------- /xmlui/src/components-core/appContext/math-function.ts: -------------------------------------------------------------------------------- ```typescript 1 | /** 2 | * This function calculates the average of the specified values and returns it. 3 | * @param values Values to calculate the average 4 | * @param decimals Number of decimal places to round the result 5 | */ 6 | function avg(values: number[], decimals?: number): number { 7 | if (values.length === 0) { 8 | return 0; 9 | } 10 | const sumValues = sum(values); 11 | const result = sumValues / values.length; 12 | return decimals ? Number(result.toFixed(decimals)) : result; 13 | } 14 | 15 | /** 16 | * This function calculates the sum of the specified values and returns it. 17 | * @param values Values to calculate the sum 18 | */ 19 | function sum(values: number[]): number { 20 | return values.reduce((acc, val) => acc + val, 0); 21 | } 22 | 23 | export const mathFunctions = { 24 | avg, 25 | sum 26 | }; ``` -------------------------------------------------------------------------------- /xmlui/scripts/generate-docs/folders.mjs: -------------------------------------------------------------------------------- ``` 1 | import { join, dirname } from "path"; 2 | import { fileURLToPath } from "url"; 3 | 4 | export const FOLDERS = { 5 | // import.meta.dirname only works in with ES Modules (Node.js 20.11+) 6 | // fallback used for older Node versions (support Node.js 15+) 7 | script: import.meta.dirname ?? fileURLToPath(new URL('.', import.meta.url)), 8 | xmluiDist: join(dirname(fileURLToPath(import.meta.url)), "../../", "dist"), 9 | projectRoot: join(dirname(fileURLToPath(import.meta.url)), "../../../"), 10 | docsRoot: join(dirname(fileURLToPath(import.meta.url)), "../../../", "docs"), 11 | pages: join(dirname(fileURLToPath(import.meta.url)), "../../../", "docs", "pages"), 12 | docsMeta: join(dirname(fileURLToPath(import.meta.url)), "../../../", "docs", "meta"), 13 | } 14 | ```