#
tokens: 47696/50000 2/1635 files (page 113/191)
lines: on (toggle) GitHub
raw markdown copy reset
This is page 113 of 191. Use http://codebase.md/xmlui-org/xmlui/main.tsx?lines=true&page={x} to view the full context.

# Directory Structure

```
├── .changeset
│   └── config.json
├── .eslintrc.cjs
├── .github
│   ├── build-checklist.png
│   ├── ISSUE_TEMPLATE
│   │   ├── bug_report.md
│   │   └── feature_request.md
│   └── workflows
│       ├── deploy-blog-optimized.yml
│       ├── deploy-blog-swa.yml
│       ├── deploy-blog.yml
│       ├── deploy-docs-optimized.yml
│       ├── deploy-docs-swa.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
│   │   │   │   ├── an-advanced-codefence.gif
│   │   │   │   ├── an-advanced-codefence.mp4
│   │   │   │   ├── blog-page-component.png
│   │   │   │   ├── blog-scrabble.png
│   │   │   │   ├── codefence-runner.png
│   │   │   │   ├── integrated-blog-search.png
│   │   │   │   ├── lorem-ipsum.png
│   │   │   │   ├── playground-checkbox-source.png
│   │   │   │   ├── playground.png
│   │   │   │   ├── use-xmlui-mcp-to-find-a-howto.png
│   │   │   │   └── xmlui-demo-gallery.png
│   │   │   ├── introducing-xmlui.md
│   │   │   ├── lorem-ipsum.md
│   │   │   ├── newest-post.md
│   │   │   ├── older-post.md
│   │   │   ├── xmlui-playground.md
│   │   │   └── xmlui-powered-blog.md
│   │   ├── mockServiceWorker.js
│   │   ├── resources
│   │   │   ├── favicon.ico
│   │   │   ├── files
│   │   │   │   └── for-download
│   │   │   │       └── xmlui
│   │   │   │           └── xmlui-standalone.umd.js
│   │   │   ├── github.svg
│   │   │   ├── icons
│   │   │   │   ├── github.svg
│   │   │   │   └── rss.svg
│   │   │   ├── llms.txt
│   │   │   ├── logo-dark.svg
│   │   │   ├── logo.svg
│   │   │   ├── pg-popout.svg
│   │   │   ├── rss.svg
│   │   │   └── xmlui-logo.svg
│   │   ├── serve.json
│   │   ├── staticwebapp.config.json
│   │   └── web.config
│   ├── scripts
│   │   ├── download-latest-xmlui.js
│   │   ├── generate-rss.js
│   │   ├── get-releases.js
│   │   └── utils.js
│   ├── src
│   │   ├── components
│   │   │   ├── BlogOverview.xmlui
│   │   │   ├── BlogPage.xmlui
│   │   │   ├── LinkButton.xmlui
│   │   │   ├── PageNotFound.xmlui
│   │   │   └── Separator.xmlui
│   │   ├── config.ts
│   │   ├── Main.xmlui
│   │   └── themes
│   │       └── blog-theme.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
│   │   │   ├── ResponsiveBar.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
│   │   │   │   ├── control-cache-invalidation.md
│   │   │   │   ├── debounce-user-input-for-api-calls.md
│   │   │   │   ├── debounce-with-changelistener.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
│   │   │   │   ├── make-navpanel-width-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-modal-dialog-onclose.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
│   │   │   ├── icons
│   │   │   │   ├── github.svg
│   │   │   │   └── rss.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
│   │   ├── staticwebapp.config.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
│   │   │   ├── LinkButton.xmlui
│   │   │   ├── NameValue.xmlui
│   │   │   ├── PageNotFound.xmlui
│   │   │   ├── PaletteItem.xmlui
│   │   │   ├── Palettes.xmlui
│   │   │   ├── SectionHeader.xmlui
│   │   │   ├── Separator.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
│   ├── tsconfig.json
│   ├── 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
│   ├── 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
│   │   └── 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
│   ├── 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
│   ├── 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
│   ├── 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.module.scss
│   │       │   ├── 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.tsx
│   │       │   ├── StandalonePlayground.tsx
│   │       │   ├── StandalonePlaygroundNative.module.scss
│   │       │   ├── StandalonePlaygroundNative.tsx
│   │       │   ├── ThemeSwitcher.module.scss
│   │       │   ├── ThemeSwitcher.tsx
│   │       │   └── utils.ts
│   │       ├── providers
│   │       │   ├── Toast.module.scss
│   │       │   └── ToastProvider.tsx
│   │       ├── state
│   │       │   └── store.ts
│   │       ├── themes
│   │       │   └── theme.ts
│   │       └── utils
│   │           └── helpers.ts
│   ├── 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
│   ├── xmlui-spreadsheet
│   │   ├── .gitignore
│   │   ├── demo
│   │   │   └── Main.xmlui
│   │   ├── index.html
│   │   ├── index.ts
│   │   ├── meta
│   │   │   └── componentsMetadata.ts
│   │   ├── package.json
│   │   └── src
│   │       ├── index.tsx
│   │       ├── Spreadsheet.tsx
│   │       └── SpreadsheetNative.tsx
│   └── 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.spec.ts
│           │   ├── HeroSection.tsx
│           │   └── HeroSectionNative.tsx
│           ├── index.tsx
│           ├── ScrollToTop
│           │   ├── ScrollToTop.module.scss
│           │   ├── ScrollToTop.tsx
│           │   └── ScrollToTopNative.tsx
│           └── vite-env.d.ts
├── playwright.config.ts
├── 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.cjs
    │   ├── 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
    │   ├── build-system.md
    │   ├── build-xmlui.md
    │   ├── component-behaviors.md
    │   ├── component-metadata.md
    │   ├── components-with-options.md
    │   ├── containers.md
    │   ├── data-operations.md
    │   ├── glossary.md
    │   ├── index.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
    │   ├── standalone-app.md
    │   ├── theme-variables-refactoring.md
    │   ├── ud-components.md
    │   └── xmlui-repo.md
    ├── package.json
    ├── scripts
    │   ├── coverage-only.js
    │   ├── e2e-test-summary.js
    │   ├── extract-component-metadata.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
    │   ├── generate-metadata-markdown.js
    │   ├── get-langserver-metadata.js
    │   ├── 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.module.scss
    │   │   │   │   ├── LabelList.spec.ts
    │   │   │   │   ├── LabelList.tsx
    │   │   │   │   └── 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
    │   │   │   └── test-padding.xmlui
    │   │   ├── 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
    │   │   │   ├── ResponsiveBarItem.tsx
    │   │   │   └── ResponsiveBarNative.tsx
    │   │   ├── Select
    │   │   │   ├── HiddenOption.tsx
    │   │   │   ├── OptionContext.ts
    │   │   │   ├── Select.md
    │   │   │   ├── Select.module.scss
    │   │   │   ├── Select.spec.ts
    │   │   │   ├── Select.tsx
    │   │   │   ├── SelectContext.tsx
    │   │   │   └── SelectNative.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
    │   │   │   └── 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
    │   │   │   ├── base64-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.js
    │   ├── 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
    │   │   │   ├── index.ts
    │   │   │   ├── ModalDialogDriver.ts
    │   │   │   ├── NumberBoxDriver.ts
    │   │   │   ├── TextBoxDriver.ts
    │   │   │   ├── TimeInputDriver.ts
    │   │   │   ├── TimerDriver.ts
    │   │   │   └── TreeDriver.ts
    │   │   ├── fixtures.ts
    │   │   ├── index.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
    │   └── 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.json
    ├── tsdown.config.ts
    ├── vite.config.ts
    └── vitest.config.ts
```

# Files

--------------------------------------------------------------------------------
/xmlui/tests/parsers/scripting/eval-tree.test.ts:
--------------------------------------------------------------------------------

```typescript
  1 | import { describe, expect, it, assert } from "vitest";
  2 | 
  3 | import { Parser } from "../../../src/parsers/scripting/Parser";
  4 | import {
  5 |   evalBinding,
  6 |   evalBindingExpression,
  7 | } from "../../../src/components-core/script-runner/eval-tree-sync";
  8 | import { createEvalContext } from "./test-helpers";
  9 | import { evalBindingAsync } from "../../../src/components-core/script-runner/eval-tree-async";
 10 | 
 11 | describe("Evaluate binding expression tree", () => {
 12 |   const literalCases = [
 13 |     { src: "undefined", exp: undefined },
 14 |     { src: "null", exp: null },
 15 |     { src: "Infinity", exp: Infinity },
 16 |     { src: "false", exp: false },
 17 |     { src: "true", exp: true },
 18 |     { src: "123", exp: 123 },
 19 |     { src: "123.25", exp: 123.25 },
 20 |     { src: "123.25e11", exp: 123.25e11 },
 21 |     { src: "0b11_11", exp: 0x0f },
 22 |     { src: "0x12_ae", exp: 0x12ae },
 23 |     {
 24 |       src: "123456789123456789123456789",
 25 |       exp: BigInt("123456789123456789123456789"),
 26 |     },
 27 |     { src: '"Hello"', exp: "Hello" },
 28 | 
 29 |     { src: "Math", exp: Math },
 30 |     { src: "Math", con: { Math: 123 }, exp: 123 },
 31 |     { src: "::Math", exp: Math },
 32 |     { src: "::Math", con: { Math: 123 }, exp: Math },
 33 |   ];
 34 |   literalCases.forEach((c) => {
 35 |     it(`Eval literal: ${c.src}`, () => {
 36 |       // --- Arrange
 37 |       const wParser = new Parser(c.src);
 38 | 
 39 |       // --- Act/Assert
 40 |       const expr = wParser.parseExpr();
 41 |       expect(expr).not.equal(null);
 42 |       if (!expr) return;
 43 |       const context = createEvalContext({ localContext: (c as any).con ?? {} });
 44 |       const value = evalBinding(expr, context);
 45 |       expect(value).equal(c.exp);
 46 |     });
 47 |   });
 48 | 
 49 |   it(`Eval literal: NaN`, () => {
 50 |     // --- Arrange
 51 |     const wParser = new Parser("NaN");
 52 | 
 53 |     // --- Act/Assert
 54 |     const expr = wParser.parseExpr();
 55 |     expect(expr).not.equal(null);
 56 |     if (!expr) return;
 57 |     const context = createEvalContext({ localContext: {} });
 58 |     const value = evalBinding(expr, context);
 59 |     expect(isNaN(value)).equal(true);
 60 |   });
 61 | 
 62 |   const identifierCases = [
 63 |     { src: "alma", con: { alma: undefined }, exp: undefined },
 64 |     { src: "alma", con: { alma: 112 }, exp: 112 },
 65 |     { src: "banana", con: { alma: 112, banana: 223 }, exp: 223 },
 66 |     { src: "alma", con: { alma: "abc", banana: 223 }, exp: "abc" },
 67 |     { src: "alma", con: { alma: true, banana: 223 }, exp: true },
 68 |     { src: "alma", con: { alma: false, banana: 223 }, exp: false },
 69 |     { src: "alma", con: { alma: 123.5, banana: 223 }, exp: 123.5 },
 70 |   ];
 71 |   identifierCases.forEach((c) => {
 72 |     it(`Eval identifier: ${c.src}/${JSON.stringify(c.con)}`, () => {
 73 |       // --- Arrange
 74 |       const wParser = new Parser(c.src);
 75 | 
 76 |       // --- Act/Assert
 77 |       const expr = wParser.parseExpr();
 78 |       expect(expr).not.equal(null);
 79 |       if (!expr) return;
 80 |       const context = createEvalContext({ localContext: c.con });
 81 |       const value = evalBinding(expr, context);
 82 |       expect(value).equal(c.exp);
 83 |     });
 84 |   });
 85 | 
 86 |   const memberAccessCases = [
 87 |     { src: "alma.b", con: { alma: { b: 123 } }, exp: 123 },
 88 |     { src: "alma.b.c", con: { alma: { b: { c: 123, d: 234 } } }, exp: 123 },
 89 |     { src: "alma.b.d", con: { alma: { b: { c: 123, d: 234 } } }, exp: 234 },
 90 |     { src: "alma.length", con: { alma: "banana" }, exp: 6 },
 91 |     {
 92 |       src: "alma.b.d.length",
 93 |       con: { alma: { b: { c: 123, d: "hello" } } },
 94 |       exp: 5,
 95 |     },
 96 |     { src: "Math.sin", con: { alma: "banana" }, exp: Math.sin },
 97 |   ];
 98 |   memberAccessCases.forEach((c) => {
 99 |     it(`Eval member access: ${c.src}/${JSON.stringify(c.con)}`, () => {
100 |       // --- Arrange
101 |       const wParser = new Parser(c.src);
102 | 
103 |       // --- Act/Assert
104 |       const expr = wParser.parseExpr();
105 |       expect(expr).not.equal(null);
106 |       if (!expr) return;
107 |       const context = createEvalContext({ localContext: c.con });
108 |       const value = evalBinding(expr, context);
109 |       expect(value).equal(c.exp);
110 |     });
111 |   });
112 | 
113 |   const calculatedMemberAccessCases = [
114 |     { src: 'alma["b"]', con: { alma: { b: 123 } }, exp: 123 },
115 |     {
116 |       src: 'alma["b"]["c"]',
117 |       con: { alma: { b: { c: 123, d: 234 } } },
118 |       exp: 123,
119 |     },
120 |     {
121 |       src: 'alma["b"]["d"]',
122 |       con: { alma: { b: { c: 123, d: 234 } } },
123 |       exp: 234,
124 |     },
125 |     { src: 'alma["length"]', con: { alma: "banana" }, exp: 6 },
126 |     { src: "alma[0]", con: { alma: [1, true, "banana"] }, exp: 1 },
127 |     { src: "alma[1]", con: { alma: [1, true, "banana"] }, exp: true },
128 |     { src: "alma[2]", con: { alma: [1, true, "banana"] }, exp: "banana" },
129 |   ];
130 |   calculatedMemberAccessCases.forEach((c) => {
131 |     it(`Eval member access: ${c.src}/${JSON.stringify(c.con)}`, () => {
132 |       // --- Arrange
133 |       const wParser = new Parser(c.src);
134 | 
135 |       // --- Act/Assert
136 |       const expr = wParser.parseExpr();
137 |       expect(expr).not.equal(null);
138 |       if (!expr) return;
139 |       const context = createEvalContext({ localContext: c.con });
140 |       const value = evalBinding(expr, context);
141 |       expect(value).equal(c.exp);
142 |     });
143 |   });
144 | 
145 |   const optionalMemberAccessCases = [
146 |     { src: "alma?.b", con: { alma: { b: 123 } }, exp: 123 },
147 |     { src: "alma?.b", con: { alma: { b: null } }, exp: null },
148 |     { src: "alma?.b", con: { pear: { b: 123 }, alma: undefined }, exp: undefined },
149 |     { src: "alma?.b?.c", con: { alma: { b: { c: 123, d: 234 } } }, exp: 123 },
150 |     { src: "alma?.b?.c", con: { alma: { b: { c: null, d: 234 } } }, exp: null },
151 |     {
152 |       src: "alma?.b?.c",
153 |       con: { pear: { b: { c: 123, d: 234 } }, alma: undefined },
154 |       exp: undefined,
155 |     },
156 |     {
157 |       src: "alma?.b?.c",
158 |       con: { alma: { b: { w: 123, d: 234 } } },
159 |       exp: undefined,
160 |     },
161 |     {
162 |       src: "alma?.b?.c",
163 |       con: { pear: { b: { w: 123, d: 234 } }, alma: undefined },
164 |       exp: undefined,
165 |     },
166 |   ];
167 |   optionalMemberAccessCases.forEach((c) => {
168 |     it(`Eval member access: ${c.src}/${JSON.stringify(c.con)}`, () => {
169 |       // --- Arrange
170 |       const wParser = new Parser(c.src);
171 | 
172 |       // --- Act/Assert
173 |       const expr = wParser.parseExpr();
174 |       expect(expr).not.equal(null);
175 |       if (!expr) return;
176 |       const context = createEvalContext({ localContext: c.con });
177 |       const value = evalBinding(expr, context);
178 |       expect(value).equal(c.exp);
179 |     });
180 |   });
181 | 
182 |   const defaultedMemberAccessCases = [
183 |     { src: "alma.b", con: { alma: { b: 123 } }, exp: 123 },
184 |     { src: "alma.b", con: { alma: { b: null } }, exp: null },
185 |     { src: "alma.b", con: { pear: { b: 123 }, alma: undefined }, exp: undefined },
186 |     { src: "alma.b.c", con: { alma: { b: { c: 123, d: 234 } } }, exp: 123 },
187 |     { src: "alma.b.c", con: { alma: { b: { c: null, d: 234 } } }, exp: null },
188 |     {
189 |       src: "alma.b.c",
190 |       con: { pear: { b: { c: 123, d: 234 } }, alma: undefined },
191 |       exp: undefined,
192 |     },
193 |     {
194 |       src: "alma.b.c",
195 |       con: { alma: { b: { w: 123, d: 234 } } },
196 |       exp: undefined,
197 |     },
198 |     {
199 |       src: "alma.b.c",
200 |       con: { pear: { b: { w: 123, d: 234 } }, alma: undefined },
201 |       exp: undefined,
202 |     },
203 |   ];
204 |   defaultedMemberAccessCases.forEach((c) => {
205 |     it(`Eval forced optional member access: ${c.src}/${JSON.stringify(c.con)}`, () => {
206 |       // --- Arrange
207 |       const wParser = new Parser(c.src);
208 | 
209 |       // --- Act/Assert
210 |       const expr = wParser.parseExpr();
211 |       expect(expr).not.equal(null);
212 |       if (!expr) return;
213 |       const context = createEvalContext({
214 |         localContext: c.con,
215 |         appContext: {},
216 |         options: { defaultToOptionalMemberAccess: true },
217 |       });
218 |       const value = evalBinding(expr, context);
219 |       expect(value).equal(c.exp);
220 |     });
221 |   });
222 | 
223 |   const sequenceCases = [
224 |     { src: "0, alma.b", con: { alma: { b: 123 } }, exp: 123 },
225 |     {
226 |       src: "1, a+b, alma.b.c",
227 |       con: { alma: { b: { c: 123, d: 234 } }, a: 0, b: 0 },
228 |       exp: 123,
229 |     },
230 |     {
231 |       src: "2, a+b, alma.b.d",
232 |       con: { alma: { b: { c: 123, d: 234 } }, a: 0, b: 0 },
233 |       exp: 234,
234 |     },
235 |     { src: "1, 2, 3, alma.length", con: { alma: "banana" }, exp: 6 },
236 |     {
237 |       src: "alma, alma, alma.b.d.length",
238 |       con: { alma: { b: { c: 123, d: "hello" } } },
239 |       exp: 5,
240 |     },
241 |   ];
242 |   sequenceCases.forEach((c) => {
243 |     it(`Eval sequence expression: ${c.src}/${JSON.stringify(c.con)}`, () => {
244 |       // --- Arrange
245 |       const wParser = new Parser(c.src);
246 | 
247 |       // --- Act/Assert
248 |       const expr = wParser.parseExpr();
249 |       expect(expr).not.equal(null);
250 |       if (!expr) return;
251 |       const context = createEvalContext({ localContext: c.con });
252 |       const value = evalBinding(expr, context);
253 |       expect(value).equal(c.exp);
254 |     });
255 |   });
256 | 
257 |   const arrayLiteralCases = [
258 |     {
259 |       src: "[ alma.a, alma.b]",
260 |       con: { alma: { a: 234, b: 123 } },
261 |       exp: [234, 123],
262 |     },
263 |     {
264 |       src: '[ "banana", alma.a, alma.b]',
265 |       con: { alma: { a: 234, b: 123 } },
266 |       exp: ["banana", 234, 123],
267 |     },
268 |     {
269 |       src: '[ "banana", alma.a, alma.b.c]',
270 |       con: { alma: { a: 234, b: { f: false, c: true } } },
271 |       exp: ["banana", 234, true],
272 |     },
273 |   ];
274 |   arrayLiteralCases.forEach((c) => {
275 |     it(`Array literal: ${c.src}/${JSON.stringify(c.con)}`, () => {
276 |       // --- Arrange
277 |       const wParser = new Parser(c.src);
278 | 
279 |       // --- Act/Assert
280 |       const expr = wParser.parseExpr();
281 |       expect(expr).not.equal(null);
282 |       if (!expr) return;
283 |       const context = createEvalContext({ localContext: c.con });
284 |       const value = evalBinding(expr, context);
285 |       expect(value.length).equal(c.exp.length);
286 |       for (let i = 0; i < value.length; i++) {
287 |         expect(value[i]).equal(c.exp[i]);
288 |       }
289 |     });
290 |   });
291 | 
292 |   const objectLiteralCases = [
293 |     {
294 |       src: "{ a: alma.a, b: alma.b }",
295 |       con: { alma: { a: 234, b: 123 } },
296 |       exp: { a: 234, b: 123 },
297 |     },
298 |     {
299 |       src: "{ a: true, b: alma.b }",
300 |       con: { alma: { a: 234, b: 123 } },
301 |       exp: { a: true, b: 123 },
302 |     },
303 |     {
304 |       src: '{ a: alma.a, b: "banana" }',
305 |       con: { alma: { a: 234, b: 123 } },
306 |       exp: { a: 234, b: "banana" },
307 |     },
308 |     {
309 |       src: '{ "q": alma.a, b: "banana" }',
310 |       con: { alma: { a: 234, b: 123 } },
311 |       exp: { q: 234, b: "banana" },
312 |     },
313 |     {
314 |       src: '{ 123: alma.a, b: "banana" }',
315 |       con: { alma: { a: 234, b: 123 } },
316 |       exp: { 123: 234, b: "banana" },
317 |     },
318 |     {
319 |       src: '{ [1+2]: alma.a, b: "banana" }',
320 |       con: { alma: { a: 234, b: 123 } },
321 |       exp: { 3: 234, b: "banana" },
322 |     },
323 |     {
324 |       src: '{ ["abc".length]: alma.a, b: "banana" }',
325 |       con: { alma: { a: 234, b: 123 } },
326 |       exp: { 3: 234, b: "banana" },
327 |     },
328 |     {
329 |       src: '{ ["app" + "le"]: alma.a, b: "banana" }',
330 |       con: { alma: { a: 234, b: 123 } },
331 |       exp: { apple: 234, b: "banana" },
332 |     },
333 |   ];
334 |   objectLiteralCases.forEach((c) => {
335 |     it(`Object literal: ${c.src}/${JSON.stringify(c.con)}`, () => {
336 |       // --- Arrange
337 |       const wParser = new Parser(c.src);
338 | 
339 |       // --- Act/Assert
340 |       const expr = wParser.parseExpr();
341 |       expect(expr).not.equal(null);
342 |       if (!expr) return;
343 |       const context = createEvalContext({ localContext: c.con });
344 |       const value = evalBinding(expr, context);
345 |       for (const key in c.exp) {
346 |         expect(value[key]).equal((c.exp as any)[key]);
347 |       }
348 |     });
349 |   });
350 | 
351 |   const unaryCases = [
352 |     { src: "+alma.b", con: { alma: { b: 123 } }, exp: 123 },
353 |     { src: "-alma.b", con: { alma: { b: 123 } }, exp: -123 },
354 |     { src: "!alma.b", con: { alma: { b: 0 } }, exp: true },
355 |     { src: "!alma.b", con: { alma: { b: 123 } }, exp: false },
356 |     { src: "~alma.b", con: { alma: { b: 123 } }, exp: -124 },
357 |     { src: "~alma.b", con: { alma: { b: 0 } }, exp: -1 },
358 |     { src: "typeof alma.b", con: { alma: { b: 0 } }, exp: "number" },
359 |     { src: "typeof alma.b", con: { alma: { b: "Hello" } }, exp: "string" },
360 |     { src: "typeof alma.b", con: { alma: { b: false } }, exp: "boolean" },
361 |     { src: "typeof alma.b", con: { alma: { b: null } }, exp: "object" },
362 |     { src: "typeof alma.b", con: { alma: {} }, exp: "undefined" },
363 |     { src: "typeof alma.b", con: { alma: { b: {} } }, exp: "object" },
364 |     { src: "typeof alma.b", con: { alma: { b: [1, 2, 3] } }, exp: "object" },
365 |   ];
366 |   unaryCases.forEach((c) => {
367 |     it(`Unary operation: ${c.src}/${JSON.stringify(c.con)}`, () => {
368 |       // --- Arrange
369 |       const wParser = new Parser(c.src);
370 | 
371 |       // --- Act/Assert
372 |       const expr = wParser.parseExpr();
373 |       expect(expr).not.equal(null);
374 |       if (!expr) return;
375 |       const context = createEvalContext({ localContext: c.con });
376 |       const value = evalBinding(expr, context);
377 |       expect(value).equal(c.exp);
378 |     });
379 |   });
380 | 
381 |   const binaryCases = [
382 |     { src: "alma.b * c", con: { alma: { b: 123 }, c: 3 }, exp: 369 },
383 |     { src: "alma.b / c", con: { alma: { b: 123 }, c: 3 }, exp: 41 },
384 |     { src: "alma.b % c", con: { alma: { b: 125 }, c: 3 }, exp: 2 },
385 |     { src: "alma.b + 3", con: { alma: { b: 123 } }, exp: 126 },
386 |     {
387 |       src: "123456789123456789 + 123456789123456789123",
388 |       con: {},
389 |       exp: BigInt("123580245912580245912"),
390 |     },
391 |     { src: '"👍" + "🚀"', con: {}, exp: "👍🚀" },
392 |     { src: '"Hello," + " World!"', con: {}, exp: "Hello, World!" },
393 |     { src: "alma.b - 3", con: { alma: { b: 123 } }, exp: 120 },
394 |     { src: "alma.b >> 2", con: { alma: { b: 123 } }, exp: 30 },
395 |     { src: "alma.b >> 2", con: { alma: { b: 123 } }, exp: 30 },
396 |     { src: "-alma.b >> 2", con: { alma: { b: 123 } }, exp: -31 },
397 |     { src: "alma.b >>> 2", con: { alma: { b: 123 } }, exp: 30 },
398 |     { src: "-alma.b >>> 2", con: { alma: { b: 123 } }, exp: 1073741793 },
399 |     { src: "alma.b < 3", con: { alma: { b: 123 } }, exp: false },
400 |     { src: "alma.b <= 123", con: { alma: { b: 123 } }, exp: true },
401 |     { src: "alma.b > 123", con: { alma: { b: 123 } }, exp: false },
402 |     { src: "alma.b >= 123", con: { alma: { b: 123 } }, exp: true },
403 |     { src: "alma.b >= 123", con: { alma: { b: 123 } }, exp: true },
404 |     { src: "2 in [12, 123, 1234]", con: { alma: { b: 123 } }, exp: true },
405 |     { src: '"PI" in Math', con: { alma: { b: 123 } }, exp: true },
406 |     { src: "alma.b == 3", con: { alma: { b: 123 } }, exp: false },
407 |     { src: "alma.b == 123", con: { alma: { b: 123 } }, exp: true },
408 |     { src: "alma.b === 123", con: { alma: { b: 123 } }, exp: true },
409 |     { src: "alma.b != 3", con: { alma: { b: 123 } }, exp: true },
410 |     { src: "alma.b != 123", con: { alma: { b: 123 } }, exp: false },
411 |     { src: "alma.b !== 123", con: { alma: { b: 123 } }, exp: false },
412 |     { src: "alma.b & 12", con: { alma: { b: 123 } }, exp: 8 },
413 |     { src: "alma.b | 12", con: { alma: { b: 123 } }, exp: 127 },
414 |     { src: "alma.b ^ 12", con: { alma: { b: 123 } }, exp: 119 },
415 |     { src: "alma.b && 12", con: { alma: { b: 123 } }, exp: 12 },
416 |     { src: "alma.b && 12 > 3", con: { alma: { b: 123 } }, exp: true },
417 |     { src: "alma.b || 12", con: { alma: { b: 123 } }, exp: 123 },
418 |     { src: "alma.b || 12 > 3", con: { alma: { b: 123 } }, exp: 123 },
419 |     { src: "alma.b < 3 || 12 > 3", con: { alma: { b: 123 } }, exp: true },
420 |     { src: "12 + 23 * 4", con: {}, exp: 104 },
421 |     { src: "(12 + 23) * 4", con: {}, exp: 140 },
422 |     { src: "12 * 23 + 4", con: {}, exp: 280 },
423 |   ];
424 |   binaryCases.forEach((c) => {
425 |     it(`Binary operation: ${c.src}/${JSON.stringify(c.con)}`, () => {
426 |       const context = createEvalContext({ localContext: c.con });
427 |       const value = evalBindingExpression(c.src, context);
428 |       expect(value).equal(c.exp);
429 |     });
430 |   });
431 | 
432 |   const exponentialCases = [
433 |     {
434 |       src: "2**3",
435 |       exp: 8,
436 |     },
437 |     {
438 |       src: "2**3**2",
439 |       exp: 512,
440 |     },
441 |     {
442 |       src: "4**2**3",
443 |       exp: 65536,
444 |     },
445 |     {
446 |       src: "1.5**2",
447 |       exp: 2.25,
448 |     },
449 |     {
450 |       src: "1.5**2**3",
451 |       exp: 25.62890625,
452 |     },
453 |   ];
454 |   exponentialCases.forEach((c) => {
455 |     it(`Conditional: ${c.src}`, () => {
456 |       // --- Arrange
457 |       const wParser = new Parser(c.src);
458 | 
459 |       // --- Act/Assert
460 |       const expr = wParser.parseExpr();
461 |       expect(expr).not.equal(null);
462 |       if (!expr) return;
463 |       const context = createEvalContext({ localContext: {} });
464 |       const value = evalBinding(expr, context);
465 |       expect(value).equal(c.exp);
466 |     });
467 |   });
468 | 
469 |   const functionInvocationCases = [
470 |     {
471 |       src: "Math.sin(0)",
472 |       con: { alma: { a: 234, b: 123 } },
473 |       exp: 0,
474 |     },
475 |     {
476 |       src: "Math.cos(0.0)",
477 |       con: { alma: { a: 234, b: 123 } },
478 |       exp: 1,
479 |     },
480 |     {
481 |       src: "alma.mul(2, alma.mul(3,4)) + Math.cos(0)",
482 |       con: { alma: { mul: (a: any, b: any) => a * b, b: 123 } },
483 |       exp: 25,
484 |     },
485 |   ];
486 |   functionInvocationCases.forEach((c) => {
487 |     it(`Function call: ${c.src}/${JSON.stringify(c.con)}`, () => {
488 |       // --- Arrange
489 |       const wParser = new Parser(c.src);
490 | 
491 |       // --- Act/Assert
492 |       const expr = wParser.parseExpr();
493 |       expect(expr).not.equal(null);
494 |       if (!expr) return;
495 |       const context = createEvalContext({ localContext: c.con });
496 |       const value = evalBinding(expr, context);
497 |       expect(value).equal(c.exp);
498 |     });
499 |   });
500 | 
501 |   const itemReferenceCases = [
502 |     {
503 |       src: "$item",
504 |       con: { $item: 123 },
505 |       exp: 123,
506 |     },
507 |   ];
508 |   itemReferenceCases.forEach((c) => {
509 |     it(`Item reference: ${c.src}/${JSON.stringify(c.con)}`, () => {
510 |       // --- Arrange
511 |       const wParser = new Parser(c.src);
512 | 
513 |       // --- Act/Assert
514 |       const expr = wParser.parseExpr();
515 |       expect(expr).not.equal(null);
516 |       if (!expr) return;
517 |       const context = createEvalContext({ localContext: c.con });
518 |       const value = evalBinding(expr, context);
519 |       expect(value).equal(c.exp);
520 |     });
521 |   });
522 | 
523 |   const appContextCases = [
524 |     {
525 |       src: "alma.b",
526 |       con: { pear: 123 },
527 |       aCon: { alma: { b: 234 } },
528 |       exp: 234,
529 |     },
530 |     {
531 |       src: "alma.b",
532 |       con: { alma: { b: 123 } },
533 |       aCon: { alma: { b: 234 } },
534 |       exp: 123,
535 |     },
536 |   ];
537 |   appContextCases.forEach((c) => {
538 |     it(`App context: ${c.src}/${JSON.stringify(c.con)}`, () => {
539 |       // --- Arrange
540 |       const wParser = new Parser(c.src);
541 | 
542 |       // --- Act/Assert
543 |       const expr = wParser.parseExpr();
544 |       expect(expr).not.equal(null);
545 |       if (!expr) return;
546 |       const context = createEvalContext({ localContext: c.con, appContext: c.aCon });
547 |       const value = evalBinding(expr, context);
548 |       expect(value).equal(c.exp);
549 |     });
550 |   });
551 | 
552 |   it("Array literal with spread array", () => {
553 |     // --- Arrange
554 |     const wParser = new Parser("[5, ...[1,2,3], 4]");
555 | 
556 |     // --- Act/Assert
557 |     const expr = wParser.parseExpr();
558 |     expect(expr).not.equal(null);
559 |     if (!expr) return;
560 |     const context = createEvalContext({ localContext: {}, appContext: {} });
561 |     const value = evalBinding(expr, context);
562 |     expect(value.length).equal(5);
563 |     expect(value[0]).equal(5);
564 |     expect(value[1]).equal(1);
565 |     expect(value[2]).equal(2);
566 |     expect(value[3]).equal(3);
567 |     expect(value[4]).equal(4);
568 |   });
569 | 
570 |   it("Spread out of context", () => {
571 |     // --- Arrange
572 |     const wParser = new Parser("...[1,2,3]");
573 | 
574 |     // --- Act/Assert
575 |     const expr = wParser.parseExpr();
576 |     expect(expr).not.equal(null);
577 |     if (!expr) return;
578 |     try {
579 |       const context = createEvalContext({ localContext: {}, appContext: {} });
580 |       evalBinding(expr, context);
581 |     } catch (err: any) {
582 |       expect(err.message.indexOf("(...)")).greaterThan(-1);
583 |       return;
584 |     }
585 |     assert.fail("Exception expected");
586 |   });
587 | 
588 |   it("Array literal with spread object", () => {
589 |     // --- Arrange
590 |     const wParser = new Parser("[5, ...{a: 1, b: 2}]");
591 | 
592 |     // --- Act/Assert
593 |     const expr = wParser.parseExpr();
594 |     expect(expr).not.equal(null);
595 |     if (!expr) return;
596 |     try {
597 |       const context = createEvalContext({ localContext: {}, appContext: {} });
598 |       evalBinding(expr, context);
599 |     } catch (err: any) {
600 |       expect(err.message.indexOf("array operand")).greaterThan(-1);
601 |       return;
602 |     }
603 |     assert.fail("Exception expected");
604 |   });
605 | 
606 |   it("Object literal with spread array", () => {
607 |     // --- Arrange
608 |     const wParser = new Parser("{ a:1, ...[1,2,3], b:4}");
609 | 
610 |     // --- Act/Assert
611 |     const expr = wParser.parseExpr();
612 |     expect(expr).not.equal(null);
613 |     if (!expr) return;
614 |     const context = createEvalContext({ localContext: {}, appContext: {} });
615 |     const value = evalBinding(expr, context);
616 |     expect(value[0]).equal(1);
617 |     expect(value[1]).equal(2);
618 |     expect(value[2]).equal(3);
619 |     expect(value["a"]).equal(1);
620 |     expect(value["b"]).equal(4);
621 |   });
622 | 
623 |   it("Object literal with spread object", () => {
624 |     // --- Arrange
625 |     const wParser = new Parser("{ a:1, ...{ c:3, d:5}, b:4}");
626 | 
627 |     // --- Act/Assert
628 |     const expr = wParser.parseExpr();
629 |     expect(expr).not.equal(null);
630 |     if (!expr) return;
631 |     const context = createEvalContext({ localContext: {}, appContext: {} });
632 |     const value = evalBinding(expr, context);
633 |     expect(value["a"]).equal(1);
634 |     expect(value["b"]).equal(4);
635 |     expect(value["c"]).equal(3);
636 |     expect(value["d"]).equal(5);
637 |   });
638 | 
639 |   it("Function call with spread array", () => {
640 |     // --- Arrange
641 |     const wParser = new Parser("myFunc(1, 2, ...[3, 4], 5)");
642 | 
643 |     // --- Act/Assert
644 |     const expr = wParser.parseExpr();
645 |     expect(expr).not.equal(null);
646 |     if (!expr) return;
647 |     const context = createEvalContext({
648 |       localContext: {
649 |         myFunc(...args: any[]) {
650 |           return args.join(":");
651 |         },
652 |       },
653 |       appContext: {},
654 |     });
655 |     const value = evalBinding(expr, context);
656 |     expect(value).equal("1:2:3:4:5");
657 |   });
658 | 
659 |   it("Function call with spread object", () => {
660 |     // --- Arrange
661 |     const wParser = new Parser("myFunc(1, 2, ...{a: 1, b:2}, 5)");
662 | 
663 |     // --- Act/Assert
664 |     const expr = wParser.parseExpr();
665 |     expect(expr).not.equal(null);
666 |     if (!expr) return;
667 | 
668 |     try {
669 |       const context = createEvalContext({
670 |         localContext: {
671 |           myFunc(...args: any[]) {
672 |             return args.join(":");
673 |           },
674 |         },
675 |         appContext: {},
676 |       });
677 |       evalBinding(expr, context);
678 |     } catch (err: any) {
679 |       expect(err.message.indexOf("array operand")).greaterThan(-1);
680 |       return;
681 |     }
682 |     assert.fail("Exception expected");
683 |   });
684 | 
685 |   it("Sync function call with promise raises error", () => {
686 |     // --- Arrange
687 |     const wParser = new Parser("delay(120)");
688 | 
689 |     // --- Act/Assert
690 |     const expr = wParser.parseExpr();
691 |     expect(expr).not.equal(null);
692 |     if (!expr) return;
693 | 
694 |     try {
695 |       const context = createEvalContext({
696 |         localContext: {
697 |           delay: async (time: number) => new Promise((resolve) => setTimeout(resolve, time)),
698 |         },
699 |         appContext: {},
700 |       });
701 |       evalBinding(expr, context);
702 |     } catch (err: any) {
703 |       expect(err.message).contains("Promise");
704 |       return;
705 |     }
706 |     assert.fail("Exception expected");
707 |   });
708 | 
709 |   it("Async function call works", async () => {
710 |     // --- Arrange
711 |     const wParser = new Parser("delay(120)");
712 |     const expr = wParser.parseExpr();
713 |     expect(expr).not.equal(null);
714 |     if (!expr) return;
715 | 
716 |     // --- Act
717 |     const context = createEvalContext({
718 |       localContext: {
719 |         delay: async (time: number) => {
720 |           new Promise((resolve) => setTimeout(resolve, time));
721 |           return 123;
722 |         },
723 |       },
724 |       appContext: {},
725 |     });
726 |     const value = await evalBindingAsync(expr, context, undefined);
727 | 
728 |     // --- Assert
729 |     expect(value).equal(123);
730 |   });
731 | 
732 |   it("delete alma", () => {
733 |     // --- Arrange
734 |     const wParser = new Parser("delete alma");
735 | 
736 |     // --- Act/Assert
737 |     const expr = wParser.parseExpr();
738 |     expect(expr).not.equal(null);
739 |     if (!expr) return;
740 |     const context = createEvalContext({ localContext: { alma: {} } });
741 |     const value = evalBinding(expr, context);
742 |     expect(value).equal(true);
743 |     expect(context.localContext.alma).equal(undefined);
744 |   });
745 | 
746 |   it("delete alma.b #1", () => {
747 |     // --- Arrange
748 |     const wParser = new Parser("delete alma.b");
749 | 
750 |     // --- Act/Assert
751 |     const expr = wParser.parseExpr();
752 |     expect(expr).not.equal(null);
753 |     if (!expr) return;
754 |     const context = createEvalContext({ localContext: { alma: {} } });
755 |     const value = evalBinding(expr, context);
756 |     expect(value).equal(true);
757 |     expect(context.localContext.alma.b).equal(undefined);
758 |   });
759 | 
760 |   it("delete alma.b #2", () => {
761 |     // --- Arrange
762 |     const wParser = new Parser("delete alma.b");
763 | 
764 |     // --- Act/Assert
765 |     const expr = wParser.parseExpr();
766 |     expect(expr).not.equal(null);
767 |     if (!expr) return;
768 |     const context = createEvalContext({ localContext: { alma: { b: "hello" } } });
769 |     const value = evalBinding(expr, context);
770 |     expect(value).equal(true);
771 |     expect(context.localContext.alma.b).equal(undefined);
772 |   });
773 | 
774 |   it("delete 123", () => {
775 |     // --- Arrange
776 |     const wParser = new Parser("delete 123");
777 | 
778 |     // --- Act/Assert
779 |     const expr = wParser.parseExpr();
780 |     expect(expr).not.equal(null);
781 |     if (!expr) return;
782 |     const context = createEvalContext({});
783 |     const value = evalBinding(expr, context);
784 |     expect(value).equal(false);
785 |   });
786 | 
787 |   it("|| regression #1", () => {
788 |     // --- Arrange
789 |     const wParser = new Parser("123 || ++a");
790 | 
791 |     // --- Act/Assert
792 |     const expr = wParser.parseExpr();
793 |     expect(expr).not.equal(null);
794 |     if (!expr) return;
795 |     const context = createEvalContext({
796 |       localContext: { a: 0 },
797 |     });
798 |     const value = evalBinding(expr, context);
799 |     expect(value).equal(123);
800 |     expect(context.localContext.a).equal(0);
801 |   });
802 | 
803 |   it("|| regression #2", () => {
804 |     // --- Arrange
805 |     const wParser = new Parser("true || ++a");
806 | 
807 |     // --- Act/Assert
808 |     const expr = wParser.parseExpr();
809 |     expect(expr).not.equal(null);
810 |     if (!expr) return;
811 |     const context = createEvalContext({
812 |       localContext: { a: 0 },
813 |     });
814 |     const value = evalBinding(expr, context);
815 |     expect(value).equal(true);
816 |     expect(context.localContext.a).equal(0);
817 |   });
818 | 
819 |   it("|| regression #3 (async)", async () => {
820 |     // --- Arrange
821 |     const wParser = new Parser("123 || ++a");
822 | 
823 |     // --- Act/Assert
824 |     const expr = wParser.parseExpr();
825 |     expect(expr).not.equal(null);
826 |     if (!expr) return;
827 |     const context = createEvalContext({
828 |       localContext: { a: 0 },
829 |     });
830 |     const value = await evalBindingAsync(expr, context, context.mainThread);
831 |     expect(value).equal(123);
832 |     expect(context.localContext.a).equal(0);
833 |   });
834 | 
835 |   it("|| regression #4 (async)", async () => {
836 |     // --- Arrange
837 |     const wParser = new Parser("true || ++a");
838 | 
839 |     // --- Act/Assert
840 |     const expr = wParser.parseExpr();
841 |     expect(expr).not.equal(null);
842 |     if (!expr) return;
843 |     const context = createEvalContext({
844 |       localContext: { a: 0 },
845 |     });
846 |     const value = await evalBindingAsync(expr, context, context.mainThread);
847 |     expect(value).equal(true);
848 |     expect(context.localContext.a).equal(0);
849 |   });
850 | 
851 |   it("&& regression #1", () => {
852 |     // --- Arrange
853 |     const wParser = new Parser("'' && ++a");
854 | 
855 |     // --- Act/Assert
856 |     const expr = wParser.parseExpr();
857 |     expect(expr).not.equal(null);
858 |     if (!expr) return;
859 |     const context = createEvalContext({
860 |       localContext: { a: 0 },
861 |     });
862 |     const value = evalBinding(expr, context);
863 |     expect(value).equal("");
864 |     expect(context.localContext.a).equal(0);
865 |   });
866 | 
867 |   it("&& regression #2", () => {
868 |     // --- Arrange
869 |     const wParser = new Parser("false && ++a");
870 | 
871 |     // --- Act/Assert
872 |     const expr = wParser.parseExpr();
873 |     expect(expr).not.equal(null);
874 |     if (!expr) return;
875 |     const context = createEvalContext({
876 |       localContext: { a: 0 },
877 |     });
878 |     const value = evalBinding(expr, context);
879 |     expect(value).equal(false);
880 |     expect(context.localContext.a).equal(0);
881 |   });
882 | 
883 |   it("&& regression #3 (async)", async () => {
884 |     // --- Arrange
885 |     const wParser = new Parser("0 && ++a");
886 | 
887 |     // --- Act/Assert
888 |     const expr = wParser.parseExpr();
889 |     expect(expr).not.equal(null);
890 |     if (!expr) return;
891 |     const context = createEvalContext({
892 |       localContext: { a: 0 },
893 |     });
894 |     const value = await evalBindingAsync(expr, context, context.mainThread);
895 |     expect(value).equal(0);
896 |     expect(context.localContext.a).equal(0);
897 |   });
898 | 
899 |   it("&& regression #4 (async)", async () => {
900 |     // --- Arrange
901 |     const wParser = new Parser("false && ++a");
902 | 
903 |     // --- Act/Assert
904 |     const expr = wParser.parseExpr();
905 |     expect(expr).not.equal(null);
906 |     if (!expr) return;
907 |     const context = createEvalContext({
908 |       localContext: { a: 0 },
909 |     });
910 |     const value = await evalBindingAsync(expr, context, context.mainThread);
911 |     expect(value).equal(false);
912 |     expect(context.localContext.a).equal(0);
913 |   });
914 | });
915 | 
```

--------------------------------------------------------------------------------
/xmlui/CHANGELOG.md:
--------------------------------------------------------------------------------

```markdown
  1 | # xmlui
  2 | 
  3 | ## 0.11.15
  4 | 
  5 | ### Patch Changes
  6 | 
  7 | - 8b1f851: Fix inaccurate ResponsiveBar e2e test
  8 | 
  9 | ## 0.11.14
 10 | 
 11 | ### Patch Changes
 12 | 
 13 | - d4e05af: Review ResponsiveBar and ContentSeparator
 14 | - 7276755: The return value of the Form willSubmit event can set the data to submit
 15 | 
 16 | ## 0.11.13
 17 | 
 18 | ### Patch Changes
 19 | 
 20 | - 225a580: Review NavLink theme varaible defaults
 21 | - 5e9bd24: Fix null value handling in TextBox
 22 | 
 23 | ## 0.11.12
 24 | 
 25 | ### Patch Changes
 26 | 
 27 | - cef5d43: fix: DropdownMenu - portal issue
 28 | - a9e3115: Modify behaviors to use extractValue on attached properties
 29 | - 72d968e: Fix clearable issue with DateInput (and TimeInput)
 30 | 
 31 | ## 0.11.11
 32 | 
 33 | ### Patch Changes
 34 | 
 35 | - d32fef2: New themes created: xmlui-docs, xmlui-blog, xmlui-web
 36 | - c882b72: The "contextVars" warning with inspect="true" is fixed
 37 | 
 38 | ## 0.11.10
 39 | 
 40 | ### Patch Changes
 41 | 
 42 | - 741f760: refactor: rename size prop to thickness and add length prop in ContentSeparator
 43 | 
 44 | ## 0.11.9
 45 | 
 46 | ### Patch Changes
 47 | 
 48 | - 9c42826: Add noIndicator property to NavLink and NavGroup
 49 | 
 50 | ## 0.11.8
 51 | 
 52 | ### Patch Changes
 53 | 
 54 | - e25ea5b: Add nonSticky property to Footer
 55 | - 6f11265: feat: formatter puts ">", "/>" on a newline for long tag.
 56 | - 53c383c: Remove the experimental Choose component
 57 | 
 58 | ## 0.11.7
 59 | 
 60 | ### Patch Changes
 61 | 
 62 | - de17ae1: Add the Choose component to xmlui
 63 | - dc3d889: Fix long text handling in markdown and dialogs
 64 | 
 65 | ## 0.11.6
 66 | 
 67 | ### Patch Changes
 68 | 
 69 | - f9ac95e: Fix the variant behavior. It uses a React component now.
 70 | - 097783b: Fixed Table row deselection if multiple row selections are disabled.
 71 | - 0bace0a: Add clearable property to Select
 72 | - 07b1a3d: Add a new layout, "desktop", to App
 73 | - 0bace0a: Add padding theme vars to ContentSeparator
 74 | - 0bace0a: Review Select fontSize and minHeight theme variables
 75 | 
 76 | ## 0.11.5
 77 | 
 78 | ### Patch Changes
 79 | 
 80 | - 10d755e: refactor: xmlui-playground - design update
 81 | - b3a4194: Fixed a case where if the data provided to a Table did not have 'id' attributes, the row selection would not work correctly.
 82 | 
 83 | ## 0.11.4
 84 | 
 85 | ### Patch Changes
 86 | 
 87 | - e384c59: Change validation status signature from having one dash to two dashes to better reflect that they are status modifiers. Ex. -default -> --default, -error -> --error
 88 | - f296904: Splitter now responds the visibility changes of its children
 89 | - f296904: Temporarily disable the "variant" behavior on Button
 90 | - be73336: fix: Select - use extractValue for controlled component value prop
 91 | 
 92 | ## 0.11.3
 93 | 
 94 | ### Patch Changes
 95 | 
 96 | - 4a311e2: improve: charts - better domain configuration
 97 | - f8a75ce: Tiny Splitter updates
 98 | - bbc421b: Text strong variant style fixed
 99 | 
100 | ## 0.11.2
101 | 
102 | ### Patch Changes
103 | 
104 | - c1f306f: update package dependencies for tsx usage
105 | 
106 | ## 0.11.1
107 | 
108 | ### Patch Changes
109 | 
110 | - 7bbbb1d: Add the debounce function to globals
111 | 
112 | ## 0.11.0
113 | 
114 | ### Minor Changes
115 | 
116 | - 19145d2: xmlui builds with ESM
117 | - 5109dce: Migrate from CommonJs to ESM internally. Lays the groundwork for exporting testing capabilities.
118 | 
119 | ### Patch Changes
120 | 
121 | - fe503eb: Add enableSubmit to Form
122 | - 06bb966: Fix TableOfContents styling
123 | - e6b5810: fix: playground - app reset
124 | - db94656: improve: bar/line chart spacing
125 | - fe503eb: Queue now passes $queuedItems and $completedItems context variables to its event handlers
126 | - 82ddbe7: Fix codefence first line indent style issue
127 | - 75b701b: Extend form with hideButtonRow and FormItem with noSubmit
128 | 
129 | ## 0.10.26
130 | 
131 | ### Patch Changes
132 | 
133 | - e1b8d58: Heading now accepts "H1"..."H6", "1"..."6", too. Invalid values fall back to "h1".
134 | - 1ad832c: Remove the showNavPanelIf property from AppHeader (fix NavPanel's "when" usage)
135 | 
136 | ## 0.10.25
137 | 
138 | ### Patch Changes
139 | 
140 | - e7c503e: refactor: Select - remove radix select
141 | - 5fe3052: Fix the NavGroup click behavior in responsive view
142 | - 5fe3052: Fix the $item access issue within a ModalDialog inside a Column
143 | - 250647b: Fix the APICall becomes non-functional after first error when used with DataSource + Items + $item context issue
144 | 
145 | ## 0.10.24
146 | 
147 | ### Patch Changes
148 | 
149 | - 3e361c4: The xmlui-pg codefence now accepts emojies
150 | - 3e361c4: Exend the formatDate, formatDateTime, and formatTime functions with optional format strings
151 | 
152 | ## 0.10.23
153 | 
154 | ### Patch Changes
155 | 
156 | - bf18444: Experiment with the "variant" behavior
157 | - 6d3bb89: Form now has a willSubmit event (it can cancel the submit event)
158 | - 89c69af: Fix the boolean conversion issue with showAnchor in Heading
159 | - 4cfebf0: Fix loading code-behind files in standalone mode
160 | - 145cd68: fix: pointer-events:none when using sibling Dialog
161 | 
162 | ## 0.10.22
163 | 
164 | ### Patch Changes
165 | 
166 | - 501f60a: The behavior infrastructure now uses ComponentProvider and allows adding custom behaviors
167 | - 1020f1c: Extend Tab with the tabAlignment and accordionView properties
168 | 
169 | ## 0.10.21
170 | 
171 | ### Patch Changes
172 | 
173 | - 6fd4d62: Add custom Text variant styling
174 | 
175 | ## 0.10.20
176 | 
177 | ### Patch Changes
178 | 
179 | - 26eac90: fix: Autocomplete handles animations correctly
180 | - f53edff: Add margin-related theme variables to ContentSeparator
181 | - 1840916: Add applyIf property to Theme
182 | - c6be7a3: fix: external animation is now correctly applied to ModalDialogs as well
183 | - 6aaefaf: Added better error text when rendering FormItem outside of a Form.
184 | - 28d2585: refactor: Select and AutoComplete components
185 | - e29a231: The itemLabelWidth value of Form now supports theme variables ($space-\* values).
186 | - 22162c0: AppState now uses a merge operation to set initialValue
187 | - e90232b: fix: itemWithLabel - layout issue
188 | 
189 | ## 0.10.19
190 | 
191 | ### Patch Changes
192 | 
193 | - facb257: Add checkboxTolerance property to Table
194 | - 6084c14: test: review onFocus, onBlur e2e tests
195 | - e1fa9d7: Renamed the following properties in DatePicker: minValue -> startDate, maxValue -> endDate. Also updated component documentation.
196 | 
197 | ## 0.10.18
198 | 
199 | ### Patch Changes
200 | 
201 | - 202f2b2: refactor: use labelBehavior instead of ItemWithLabel
202 | - 6650ee8: Add back removed RadioItem
203 | - da98994: Fixed FormItem validation indicators to use a relaxed validation indication strategy.
204 | - 8394663: fix: labelBehavior, input components - styling issue
205 | 
206 | ## 0.10.17
207 | 
208 | ### Patch Changes
209 | 
210 | - 07dae0b: fix: AccordionItem produces the right error outside of Accordion component
211 | 
212 | ## 0.10.16
213 | 
214 | ### Patch Changes
215 | 
216 | - 0ba6612: Undust and improve the Tree component
217 | - 7b78052: Fixed Slider ranged version where only the first thumb is interactable.
218 | - 314b429: improve: remove cmdk from autocomple, add keywords prop to option
219 | - a1dea8f: fix: NumberBox initialValue ignores non-convertible string values, minValue and maxValue now applies to typed-in input as well as to increments / decrements with spinner buttons.
220 | - cff754c: refactor: move behavior application earlier in ComponentAdapter render flow
221 | 
222 | ## 0.10.15
223 | 
224 | ### Patch Changes
225 | 
226 | - 3c8ad14: Add the data property to the Pdf component
227 | - 5502fea: Add the "transform" layout property
228 | - e08f0ba: Add syncWithAppState and initiallySelected properties to Table
229 | - 5502fea: Fix MenuSeparator and SubMenuitem (forwardRef)
230 | - db618b5: fix: NavGroup componenet's iconVertical{Expanded,Collapsed} properties now apply based on it's 'open' state. Only the Expanded one was present before the fix.
231 | - a795b3d: Allow event handlers to use nested action components recursively
232 | - 5851c02: feat: introducing behaviors - tooltip, animation, label
233 | 
234 | ## 0.10.14
235 | 
236 | ### Patch Changes
237 | 
238 | - 618049b: fix: Modal dialog scrolling issue
239 | - 215a142: Allow image to accept binary data (and use it instead of src)
240 | - 65b52e1: Allow user-defined components in extension packages
241 | - 0cc2178: Fixed Slider input type, label focus, readOnly property, as well as min & max value issues.
242 | - 53d4ed9: Fixed feature to add custom icons for the Carousel prev/next page buttons.
243 | 
244 | ## 0.10.13
245 | 
246 | ### Patch Changes
247 | 
248 | - 9401ee0: Added short debounce to ColorPicker to make changing color values with slider a bit smoother.
249 | - eb62858: fix: assigning new properties to objects in xmlui script
250 | - eb62858: fix: stricter empty body detection in RestApiProxy
251 | - eb62858: fix: TextArea autofocus
252 | - eb62858: fix: dropdownMenu overflow
253 | - eb62858: fix: ability to use user defined components in triggerTemplate (dropdownMenu)
254 | - eb62858: select: use focus-visible instead of focus for outline
255 | - 243b7fa: fix: modal dialog/toast issue
256 | - eb62858: form: hideButtonRowUntilDirty
257 | 
258 | ## 0.10.12
259 | 
260 | ### Patch Changes
261 | 
262 | - f12a042: fix: report errors in script tag
263 | - 8731eb8: Avatar does not issue a resource URL warning when "url" is not specified
264 | - eb6454f: refactor: change LineChart/BarChart property names
265 | - 1210852: Fix the layout property usage of ModalDialog
266 | 
267 | ## 0.10.11
268 | 
269 | ### Patch Changes
270 | 
271 | - 8c76c8d: feat: style the error report colors and spaces in the browser for xmlui syntax errors
272 | - d56c3e5: RadioGroup now correctly handles different types of initialValue property values, applies readOnly property, and places necessary ARIA tags if the required property is set. Clarified component reference description on how RadioGroup and Option handles value types.
273 | - e42d367: Add FancyButton to xmlui-website-blocks
274 | - f539526: feat: BarChart - add tooltip position tracking
275 | - 19ce234: Review Option handling in Select and RadioGroup
276 | - 455b6c0: feat: add animation support to all relevant components via animation and animationOptions props
277 | - e90dc73: feat: add support for 'uses' property
278 | - 819b563: Update fontSize and lineHeight themes and style (may break existing xmlui code)
279 | - b57dfa2: Add the autoDetectTone property to App
280 | - 9dd0f97: Update Checkbox and Switch with click event metadata
281 | - 19ce234: Select accepts null as an option value; it converts a value to a string no longer
282 | - 898346d: Extend Text and Heading APIs with hasOverflow
283 | - 705dd04: Fix RestApiProxy to deliver response status when no error body specified
284 | 
285 | ## 0.10.10
286 | 
287 | ### Patch Changes
288 | 
289 | - fff80c5: Bump package version
290 | 
291 | ## 0.10.9
292 | 
293 | ### Patch Changes
294 | 
295 | - 879c09d: Component part handling and testing refactored
296 | - 3ad8514: Added tooltip value display to Slider thumbs. Removed value display from Slider label.
297 | - 0c69245: fix: virtualized list/table in ModalDialog
298 | - 4ad31fc: refactor: rename dataKeys/nameKey to xKeys/yKey and layout to orientation in chart components - BarChart, LineChart
299 | - c99f184: Fix ExpandableItem focus issue
300 | - 5032e4a: Experimenting with HeroSection
301 | - 2394f36: Enhance DateInput and TimeInput
302 | 
303 | ## 0.10.8
304 | 
305 | ### Patch Changes
306 | 
307 | - a4d62c4: Add experimental Timer component
308 | - 7ed2918: Add the appendBlob function to the ApiInterceptor backend
309 | 
310 | ## 0.10.7
311 | 
312 | ### Patch Changes
313 | 
314 | - 664ea4f: Fixed BarChart hideTickY property to not remove the Y axis when set to true.
315 | - a739a26: Fixed Checkbox and Switch visual issue. Fixed Line- and BarChart visual glitch in Table.
316 | - bdb54dd: Small fixes for tiny bugs found during MyWorkDrive update
317 | - 81724c6: Fixed BarChart tick labels not appearing.
318 | 
319 | ## 0.10.6
320 | 
321 | ### Patch Changes
322 | 
323 | - 6464ec8: fix ssr
324 | 
325 | ## 0.10.5
326 | 
327 | ### Patch Changes
328 | 
329 | - d38351d: fix missing dependency
330 | 
331 | ## 0.10.4
332 | 
333 | ### Patch Changes
334 | 
335 | - 43fd8c5: small fixes: Avatar, FileUploadDropzone, auto xsrf token handling
336 | - 1df8e5d: Autocomplete: initiallyOpen prop
337 | - 0d5d9d1: Reworked Pagination layout strategy. Provided props to better control layout: pageSizeSelectorPosition, pageInfoPosition, buttonRowPosition. These props are available in Table pagination as well.
338 | - 3def673: DropdownMenu doesn't cooperate with Fragment triggerTemplate
339 | - 428ebea: include themes.scss file in lib dist
340 | - a12ce66: FileUploadDropZone fixes (dropPlaceholder disappeared)
341 | 
342 | ## 0.10.3
343 | 
344 | ### Patch Changes
345 | 
346 | - 2e512bb: Add solid overflow handling modes to Text
347 | - 46d1d18: Remove the "codefence" Text variant
348 | - 6bc9ed1: feat: support aligning cells in a Table row vertically
349 | - 0b1f983: Add new, compound layout property name parsing
350 | - a2637f3: Text is displayed as inline (you can nest Text into Text)
351 | - eb4d592: Adding the "part" concept to native components
352 | 
353 | ## 0.10.2
354 | 
355 | ### Patch Changes
356 | 
357 | - ff14e15: fix: LineChart - sizing issue
358 | - 1451a94: feat: make input padding configurable via theme variables
359 | 
360 | ## 0.10.1
361 | 
362 | ### Patch Changes
363 | 
364 | - 442416b: Refactor visual components to allow tooltip
365 | - a018431: feat: add custom tooltip template support for Bar and Line charts
366 | - 33cb547: Pagination component now handles itemCount being undefined/null. Introduced hasPrevPage and hasNextPage props to toggle button disabled state.
367 | - b5d7537: Enhance the disabledDates property of DatePicker
368 | 
369 | ## 0.10.0
370 | 
371 | ### Minor Changes
372 | 
373 | - 000a311: Add tooltip behavior to visible components
374 | - eb8b958: Rework inline styling system, prepare for responsive styling
375 | 
376 | ### Patch Changes
377 | 
378 | - 6d0ce52: Added features to the Pagination component: page size selector dropdown control. Also added the following props: layout orientation and layout order reversal.
379 | - 8c98f33: feat: add theme variable support for LineChart stroke width
380 | - ef86593: feat: add didChange event handler to Tabs component
381 | - da5f4e7: test: create e2e tests for chart components
382 | - 47c7a2d: Integrated the new Pagination component with Table.
383 | - 740f904: Add "activated" event to TabItem
384 | - 5009c52: Add "parts" to component metadata
385 | - 2f5ec32: Remove "from" from the list or reserved script keywords, as no longer used
386 | 
387 | ## 0.9.101
388 | 
389 | ### Patch Changes
390 | 
391 | - 791b0be: Experimenting with issuing release on larger GitHub machines
392 | 
393 | ## 0.9.100
394 | 
395 | ### Patch Changes
396 | 
397 | - 2dbf6d2: Added accessibility features, enabled prop and defaultThemeVars to Pagination. Also created E2E test cases for Pagination
398 | 
399 | ## 0.9.99
400 | 
401 | ### Patch Changes
402 | 
403 | - e5a09fb: Added a separate Pagination component with events and API methods for custom pagination.
404 | - 36360f6: improve: add tickFormatterY to LineChart, create e2e tests
405 | 
406 | ## 0.9.98
407 | 
408 | ### Patch Changes
409 | 
410 | - ff781f3: new internal react component for integrating into existing react applications (StandaloneComponent)
411 | - 377f0f2: Fix image animation issue in Carousel
412 | - ce0ff76: Added hover & active styles for Slider on thumb. FileInput opens file browser on label focus.
413 | - 208768a: Fixed input adornments not changing color on setting their respective theme variable. Spinbox buttons in NumberBox now have role=spinbutton.
414 | 
415 | ## 0.9.97
416 | 
417 | ### Patch Changes
418 | 
419 | - f7e8019: Implement simple IFrame APIs
420 | 
421 | ## 0.9.96
422 | 
423 | ### Patch Changes
424 | 
425 | - 3196156: Add IFrame component (first prototype)
426 | - cfee78a: NumberBox tweaks: fixed missing padding theme var, fixed incorrect label association.
427 | - f51002a: fix: Tabs - descendant button warning
428 | - 3fa52d9: fix: Table sortBy now works as expected
429 | 
430 | ## 0.9.95
431 | 
432 | ### Patch Changes
433 | 
434 | - af6a7a0: fix: Tabs - fixed the inconsistency in the headerTemplate.
435 | - 69a2a8f: Fix the useEventHaddler hook
436 | - 29c68fe: fix: H1 ... H6 now ignores the level property
437 | 
438 | ## 0.9.94
439 | 
440 | ### Patch Changes
441 | 
442 | - 1d9365c: feat: Tabs component - use headerTemplate instead of labelTemplate/tabTemplate
443 | 
444 | ## 0.9.93
445 | 
446 | ### Patch Changes
447 | 
448 | - af17117: feat:add labelTemplate prop to TabItem component
449 | - 44da3d9: The transformation of Checkbox and Switch values (to Booleans) are now documented and tested
450 | - b7a6b9a: Fix formatHumanElapsedTime unit tests, make the local-independent
451 | - bc95844: improve: Select and AutoComplete components
452 | - 52d94a2: Fix the ComponentWrapper childrenAsTemplate issue
453 | - 6629ce5: New end-to-end tests reviewed
454 | - 0254471: Fixed the initialValue issue with TextArea
455 | - 3318cfb: feat: provide context in browser error reports
456 | 
457 | ## 0.9.92
458 | 
459 | ### Patch Changes
460 | 
461 | - 347cda1: Review component e2e tests
462 | 
463 | ## 0.9.91
464 | 
465 | ### Patch Changes
466 | 
467 | - 6a7d779: Review Slot implementation
468 | 
469 | ## 0.9.90
470 | 
471 | ### Patch Changes
472 | 
473 | - 4b57f7e: Remove Spinner tests
474 | 
475 | ## 0.9.89
476 | 
477 | ### Patch Changes
478 | 
479 | - 2968eb9: fix initialValue handling in selects in forms
480 | - 94f4eb5: safari regexp error workaround for optimized build, revert select inside form fix
481 | - 8364c03: add new TextBox and TextArea test cases
482 | 
483 | ## 0.9.88
484 | 
485 | ### Patch Changes
486 | 
487 | - b79d7d8: Fix flaky Checkbox e2e tests
488 | 
489 | ## 0.9.87
490 | 
491 | ### Patch Changes
492 | 
493 | - 33846c2: Fix ios regex failure
494 | 
495 | ## 0.9.86
496 | 
497 | ### Patch Changes
498 | 
499 | - 48af60d: Temporarily suspend new checkbox e2e tests
500 | 
501 | ## 0.9.85
502 | 
503 | ### Patch Changes
504 | 
505 | - ee8d6ad: Fix "required" validation issue with "integer" and "number" FormItem
506 | - 9ca7572: Extend the component API metadata with method signature and parameter descriptions
507 | - 6944d2f: Add a scrollIntoView method to Heading
508 | - c0c10e7: Added missing autoFocus feature and aria labels to Checkbox
509 | - cbe1ef2: Use grammar and syntax highlight files straight form the xmlui package, instead of duplicating them in every app.
510 | 
511 | ## 0.9.84
512 | 
513 | ### Patch Changes
514 | 
515 | - c54abf3: update deps
516 | 
517 | ## 0.9.83
518 | 
519 | ### Patch Changes
520 | 
521 | - 8e3d6a3: Prevent the xmlui-optimizer to raise error on ShadowRoot
522 | - 8644010: Add a scrollIntoView api to Bookmark
523 | 
524 | ## 0.9.82
525 | 
526 | ### Patch Changes
527 | 
528 | - 3bc29ae: fix: account for events with components inside them (like APICall) in a way that more syntax highlighters understand. VSCode worked fine, Shiki did not.
529 | - 1101bf5: Fix a React warning in MarkdownNative (headingRef)
530 | - cd8db58: Fixed ModalDialog overlay and fullScreen in nested apps. Now dialogs defined in nested apps stay inside them.
531 | - 13beb58: Fixed ModalDialog context error when dialog is called from ApiCall or components using "confirm" in XMLUI code.
532 | - 79c1d8a: fix: allow the playground to use the same tone as its source
533 | 
534 | ## 0.9.81
535 | 
536 | ### Patch Changes
537 | 
538 | - 59680b7: Allow configuring the initiallyShowCode flag in ComponentViewer
539 | 
540 | ## 0.9.80
541 | 
542 | ### Patch Changes
543 | 
544 | - 4598566: NumberBox and FromItem type="number" accepts numeric string as initialValue
545 | - 14e6a7d: feat: add splitView to code inspection
546 | - cf05bd2: Fix non-fatal StandaloneApp.tsx issue
547 | 
548 | ## 0.9.79
549 | 
550 | ### Patch Changes
551 | 
552 | - ad21a31: enhance treeshaking
553 | 
554 | ## 0.9.78
555 | 
556 | ### Patch Changes
557 | 
558 | - 94a68f0: Toggle password visibility in PasswordInput
559 | - 94a68f0: Extend markdown to render compound headings with code spans and anchors
560 | - 163a45c: Add ToneSwitch with icon customization
561 | - 7ce528b: fix: BarChart - size management
562 | - c6eb9a8: Fixed scrolling to specific Bookmarks inside nested apps.
563 | 
564 | ## 0.9.77
565 | 
566 | ### Patch Changes
567 | 
568 | - c867f38: Change split view startup animation
569 | 
570 | ## 0.9.76
571 | 
572 | ### Patch Changes
573 | 
574 | - aa08a8c: introducing ApiInterceptor->useWorker: true/false
575 | - 15bf622: fix: add escaped \{ to textmate syntax, eliminate double extraction of props in FormItem causing bugs with escaped open curly brace being parsed as start of binding expression.
576 | - 5761868: improve: BarChart - add tick formatter for X and Y axes
577 | 
578 | ## 0.9.75
579 | 
580 | ### Patch Changes
581 | 
582 | - c876be8: Turn docs deploy to standard routing
583 | 
584 | ## 0.9.74
585 | 
586 | ### Patch Changes
587 | 
588 | - 0043c5d: NestedApp new prop: withSplashScreen
589 | 
590 | ## 0.9.73
591 | 
592 | ### Patch Changes
593 | 
594 | - 88bf4f6: extend formatHumanElapsedTime with a short format flag
595 | - fef53db: Allow specifying href targets with the markdown link tag
596 | - 6167648: Fix the useMouseEventHandlers hook
597 | - b2f4483: Fix missing code fence display
598 | - e9040c6: Make the nested app's header smaller
599 | 
600 | ## 0.9.72
601 | 
602 | ### Patch Changes
603 | 
604 | - 4ab3b8a: add omitH1 to TableOfContents
605 | - ac4a283: remove the AppWithCodeView component
606 | - 38454c9: fix ApiInterceptor race conditions (inside NestedApps)
607 | 
608 | ## 0.9.71
609 | 
610 | ### Patch Changes
611 | 
612 | - 5774c53: fix ssr issues with Theme components
613 | 
614 | ## 0.9.70
615 | 
616 | ### Patch Changes
617 | 
618 | - 1da7847: Adjust CodeBlock theme variables for dark tone
619 | 
620 | ## 0.9.69
621 | 
622 | ### Patch Changes
623 | 
624 | - 9b36621: fix flaky Checkbox tests
625 | 
626 | ## 0.9.68
627 | 
628 | ### Patch Changes
629 | 
630 | - 9b1f718: change: add back the logo and the buttons to the xmlui-pg split view
631 | - c79ced7: fix ssr hydration warn in AppWithCodeView
632 | - d030ac2: A few theme variable defaults updated
633 | - 21c4fd6: fix: mocked apis should work with multiple NestedApps
634 | 
635 | ## 0.9.67
636 | 
637 | ### Patch Changes
638 | 
639 | - 51a5b05: Small changes in a few component's metadata representation
640 | - 9048af1: Remove the header logo and buttons from the AppWithCodeViewNative component
641 | - 94f0e66: Accounted for some bad inputs in code fences when highlighting rows & substrings
642 | - 3f0e6b0: fix memoization for tabs, pageInfo
643 | 
644 | ## 0.9.66
645 | 
646 | ### Patch Changes
647 | 
648 | - eae8145: Fixed Switch indicator positioning
649 | - b6c64de: improve: charts - improved tick rendering
650 | - 459bd3c: improve: Logo - add inline, alt props
651 | - 96be435: feat: CodeBlock - add new themeVariables
652 | 
653 | ## 0.9.65
654 | 
655 | ### Patch Changes
656 | 
657 | - c17fc0d: fix the NestedAppNative.tsx issue introduced in #1547
658 | 
659 | ## 0.9.64
660 | 
661 | ### Patch Changes
662 | 
663 | - 5ad3ffc: Refactored the usage of theme variables in RadioGroup
664 | - da3c8bc: Add a "noHeader" option to the xmlui-pg codefence
665 | - 301cb39: Allow YAML (.yml) theme files in standalone apps
666 | - d5d3f4d: Fixed Bar- & LineChart sizing in the Table component
667 | 
668 | ## 0.9.63
669 | 
670 | ### Patch Changes
671 | 
672 | - b9c0881: Fix: add a workaround to ListNative to avoid issues coming from undefined row values
673 | 
674 | ## 0.9.62
675 | 
676 | ### Patch Changes
677 | 
678 | - 832f31d: fix: nestedApp fills the available space in AppWithCode component
679 | - 4f9ff06: Fix the build issue with FormSection
680 | 
681 | ## 0.9.61
682 | 
683 | ### Patch Changes
684 | 
685 | - 4ef5f3f: This version does not contain any real changes; it's just for bumping the version number.
686 | 
687 | ## 0.9.60
688 | 
689 | ### Patch Changes
690 | 
691 | - f37ed8c: Fine tune AppWithCodeView header
692 | - 736dbc8: improve: AppWithCode - center the XML/UI buttons
693 | - e2a6e1a: Add a popOutUrl="<url>" option to xmlui-pg to allow pop out to a custom playground location
694 | 
695 | ## 0.9.59
696 | 
697 | ### Patch Changes
698 | 
699 | - 2a07157: Rename Pages property 'defaultRoute' to 'fallbackPath'
700 | - 97b3241: improve: expanding the styles of the components responsible for code display with new theme variables.
701 | - c4abb20: Fixed RadioGroup disabled and validation indicator states. Also fixed an issue where the checked indicator was not aligned to center if the RadioGroup Option was resized in some way.
702 | - f19720c: Added 0 min width to PieChart, Fixed focus error when one checkbox's state change depended on another
703 | - 66c2288: Fixed NavLink indentation in horizontal App layout, if in a nested NavGroup in the NavPanel
704 | - 2d27204: Fixed a number of color & visual state representations of the components: DatePicker, Switch, Select, TextBox, TextArea, NumberBox, AutoComplete
705 | 
706 | ## 0.9.58
707 | 
708 | ### Patch Changes
709 | 
710 | - dc43275: Fixed Pie- & DonutChart height property.
711 | - f9562b5: make flowLayout auto-responsive behavior a bit smarter
712 | - 1af11af: fix: eliminating the duplication of toast messages
713 | - de570c2: Fixed number of small issues: Colorpicker now gets correct initial value, Options in Select now get correct keys, removed Tabs tabTemplate prop because of a bigger bug.
714 | - 7d255a9: Changed open in new window button tooltip label for all occurrences.
715 | - 69a7a1f: Fixed NavLink label break if overflowing available space.
716 | - 873348c: new form properties: onSuccess, inProgressNotificationMessage, completedNotificationMessage, errorNotificationMessage
717 | - 46bfe72: default style tweaks
718 | 
719 | ## 0.9.57
720 | 
721 | ### Patch Changes
722 | 
723 | - 93a1e70: fix: NavPanel - use layoutCss
724 | 
725 | ## 0.9.56
726 | 
727 | ### Patch Changes
728 | 
729 | - 9a3c3b6: feat: xmlui-devtools - start dialog animation from the click, use exit animation as well
730 | 
731 | ## 0.9.55
732 | 
733 | ### Patch Changes
734 | 
735 | - d507ea8: Add AppWithCodeView component to display code and running app side-by-side
736 | 
737 | ## 0.9.54
738 | 
739 | ### Patch Changes
740 | 
741 | - 2688a95: Change TreeDisplay theme variable defaults
742 | 
743 | ## 0.9.53
744 | 
745 | ### Patch Changes
746 | 
747 | - c64fa25: Allow turning on/off heading anchors in appGlobals
748 | - 73c2c21: wip: code inspector buttons - label change, devtools - animation update
749 | 
750 | ## 0.9.52
751 | 
752 | ### Patch Changes
753 | 
754 | - d079208: The Footer component no provides a themeable gap between its children.
755 | - 2a461d8: feat: NestedApp works with ApiInterceptor
756 | - ad6d81e: fix NestedApp apiUrl overwrite
757 | - f5b9f15: feat: xmlui-devtools - use it in a modal dialog
758 | - 88e4741: fix: Table columns do not allow (and indicate) sorting when bindTo is not set
759 | - 7af4b4e: change default borderColor
760 | - 851ae21: fix table styling
761 | - 7872ed0: Default theme variables changed for App, NestedApp, TableOfContents, and Text
762 | - bf00dce: enhance xmlui parser error tolerance, recovering from unclosed tags
763 | - 38180ce: merge xmlui-charts into core
764 | 
765 | ## 0.9.51
766 | 
767 | ### Patch Changes
768 | 
769 | - ef7add9: Added theme variable for setting the horizontal alignment of the logo in the NavPanel.
770 | - ba2b5cd: Moved Drawer logo position to left.
771 | - 96273bf: fix: Slider - min/max value validation
772 | - 1a81bcf: fix: Markdown renders inline/block images correclty
773 | 
774 | ## 0.9.50
775 | 
776 | ### Patch Changes
777 | 
778 | - e6c3b39: standalone usage: explicit codeBehind reference
779 | - 85031c8: Make the "marked" Text variant have lighter background color in dark mode.
780 | - d349036: Tweaked Search dropdown panel styles. Corrected Link component text and decoration hover and active colors
781 | 
782 | ## 0.9.49
783 | 
784 | ### Patch Changes
785 | 
786 | - 9afd588: fix: XmluiCodeHighlighter - update token colorizing (light/dark tone)
787 | - Updated dependencies [3b5e820]
788 |   - [email protected]
789 | 
790 | ## 0.9.48
791 | 
792 | ### Patch Changes
793 | 
794 | - b5104b0: feat: Icon component now handles the click event
795 | - 30d5c58: feat: Badge supports theme variable names in colormap
796 | - 2e7f51f: change: the canSort property of Column defaults to true
797 | - 4dd6d7f: feat: chart extension included by default
798 | - f7f0571: fix theme component
799 | 
800 | ## 0.9.47
801 | 
802 | ### Patch Changes
803 | 
804 | - a5bef5d: feat: add "inherit" variant to Text
805 | - ecc52d1: XMLUIExtensions namespace is optional
806 | - 4322e1b: fix: search context scope
807 | - 391927c: feat: add xmlui-tree codefence (displays a tree) to Markdown
808 | 
809 | ## 0.9.46
810 | 
811 | ### Patch Changes
812 | 
813 | - e20e867: improve: DatePicker - change chevrons, Slider - design updates, change drawer icon's padding
814 | - 1f83bb2: Tables in Markdown scroll horizontally if there's not enough space.
815 | - c433512: Removed close button from TextBox if type="search". Move the Search package from internal, add arrow key selection in search results and add use it in navigation drawer on small screens.
816 | - bc68330: tweak search indexer
817 | - ef3d208: improve: DatePicker - update chevrons
818 | 
819 | ## 0.9.45
820 | 
821 | ### Patch Changes
822 | 
823 | - de8d63c: Fixed small issues in CodeBlocks: adjusted row highlight length, substring highlight now works with '=' signs, corrected minor vertical positioning of code without syntax highlight, temporarily removed row numbering.
824 | - bd6d1b4: experimental: runtime search indexing
825 | - db5a5f4: fix: Allow APICall as an event handler
826 | - 69b4402: improve: docs - footer logo, FormItem - labelBreak
827 | 
828 | ## 0.9.44
829 | 
830 | ### Patch Changes
831 | 
832 | - 3eab4a3: improve: design updates - devtools, playground, docs
833 | - 411cd34: fix: inbound links to headers in markdown (anchor scroll slightly off)
834 | - cdf96bb: fix: table inside flowlayout, horizontal scrollbar
835 | - 121c55c: Changed the background color of the `marked` Text variant.
836 | - f1092fe: Added emphasized substring highlights to CodeBlocks. Use it in markdown the following way: ```xmlui !/substr/
837 | 
838 | ## 0.9.43
839 | 
840 | ### Patch Changes
841 | 
842 | - e2324bb: fix prefetchedContent handling
843 | - cacbf26: improve: AutoComplete - updating the selection logic, improved handling of readOnly and multi states, and removing unused or redundant code, improving tests
844 | - 05c8dfe: test: DatePicker - fix e2e "disabled state prevents interaction"
845 | - 42571db: test: create tests for the AutoComplete component, fix bugs
846 | - 05205c7: Add diagnostics to language server
847 | - 0a3d059: fix initial offset calculation for virtualized table/list
848 | 
849 | ## 0.9.42
850 | 
851 | ### Patch Changes
852 | 
853 | - 1ab3881: ssr fixes, experimental prefetchedContent
854 | - 3d9729d: test: add tests for the DatePicker component
855 | 
856 | ## 0.9.41
857 | 
858 | ### Patch Changes
859 | 
860 | - 42416ba: test change for CI #2
861 | 
862 | ## 0.9.40
863 | 
864 | ### Patch Changes
865 | 
866 | - 34282f0: chage to test CI
867 | 
868 | ## 0.9.39
869 | 
870 | ### Patch Changes
871 | 
872 | - b79ca46: improve: DatePicker - design update, XmluiCodeHighlighter - use layoutCss
873 | - bbec7a9: Added implicit code highlighter identification by Markdown if one is exposed under the name "codeHighlighter" in the appGlobals in config.
874 | - e67762b: Replaced Admonition emojis with icons
875 | 
876 | ## 0.9.38
877 | 
878 | ### Patch Changes
879 | 
880 | - d314bad: msw update
881 | 
882 | ## 0.9.37
883 | 
884 | ### Patch Changes
885 | 
886 | - 1c33896: ssr fixes
887 | - 8d662f3: Added anchor links for headings in markdown. Showing anchors is disabled by default, use the showHeadingAnchors prop on a Markdown component to use it.
888 | 
889 | ## 0.9.36
890 | 
891 | ### Patch Changes
892 | 
893 | - 6b0f2c1: fix: itemWithLabel fills the available width if no other value is specified
894 | 
895 | ## 0.9.35
896 | 
897 | ### Patch Changes
898 | 
899 | - ef3cd6e: Reworked NavLink & NavGroup styling: added disabled, hover & active states to button version
900 | 
901 | ## 0.9.34
902 | 
903 | ### Patch Changes
904 | 
905 | - bae8280: export NestedApp component
906 | - 415aa66: Added color palette colors for CodeBlock, vertical NavPanel now has fixed scrollbar gutter, fixed vertical collapsed icon for NavGroup.
907 | 
908 | ## 0.9.33
909 | 
910 | ### Patch Changes
911 | 
912 | - dabeb53: Fixed NavPanel background color
913 | 
914 | ## 0.9.32
915 | 
916 | ### Patch Changes
917 | 
918 | - 4019d82: xmlui-playground, new exports from xmlui
919 | - 450e1ee: feat: add aria-placeholder to Select component
920 | 
921 | ## 0.9.31
922 | 
923 | ### Patch Changes
924 | 
925 | - ed53215: test release
926 | - ed53215: another testing
927 | 
928 | ## 0.9.30
929 | 
930 | ### Patch Changes
931 | 
932 | - b0ae113: testing
933 | 
934 | ## 0.9.29
935 | 
936 | ### Patch Changes
937 | 
938 | - f15c018: another testing
939 | - f15c018: testing
940 | 
941 | ## 0.9.28
942 | 
943 | ### Patch Changes
944 | 
945 | - 421968b: testing
946 | 
947 | ## 0.9.27
948 | 
949 | ### Patch Changes
950 | 
951 | - 99bba69: testing
952 | 
953 | ## 0.9.26
954 | 
955 | ### Patch Changes
956 | 
957 | - bcf162c: testing changesets
958 | 
```
Page 113/191FirstPrevNextLast