@zeroman.yang/react-auto-components 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -3
- package/dist/adapters/xlsx.d.ts +7 -1
- package/dist/components/AutoChat/types.d.ts +7 -0
- package/dist/components/AutoDialog/index.d.ts +15 -0
- package/dist/components/AutoForm/types.d.ts +28 -0
- package/dist/components/AutoMenu/index.d.ts +7 -0
- package/dist/components/AutoSearch/index.d.ts +40 -0
- package/dist/components/AutoTable/registry.d.ts +8 -0
- package/dist/components/AutoTable/types.d.ts +69 -3
- package/dist/components/AutoTabs/index.d.ts +21 -2
- package/dist/components/AutoTabs/useAutoTabsWorkspace.d.ts +65 -0
- package/dist/core/AutoConfigProvider.d.ts +27 -0
- package/dist/core/config.d.ts +6 -1
- package/dist/core/dev.d.ts +27 -0
- package/dist/core/errors.d.ts +20 -0
- package/dist/core/query.d.ts +9 -0
- package/dist/core/registry.d.ts +33 -0
- package/dist/core/testid.d.ts +5 -0
- package/dist/core/types.d.ts +320 -17
- package/dist/errors-BT5WUIOV.js +28 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.js +1889 -1465
- package/dist/style.css +1 -1
- package/dist/xlsx.js +13 -6
- package/docs/auto-dialog.md +64 -0
- package/docs/auto-form.md +64 -0
- package/docs/auto-menu.md +47 -0
- package/docs/auto-search.md +60 -0
- package/docs/auto-table.md +144 -0
- package/docs/auto-tabs.md +99 -0
- package/docs/errors.md +118 -0
- package/docs/i18n/de/README.md +8 -2
- package/docs/i18n/de/auto-dialog.md +23 -0
- package/docs/i18n/de/auto-form.md +35 -0
- package/docs/i18n/de/auto-menu.md +23 -0
- package/docs/i18n/de/auto-search.md +32 -0
- package/docs/i18n/de/auto-table.md +31 -0
- package/docs/i18n/de/auto-tabs.md +25 -0
- package/docs/i18n/de/errors.md +110 -0
- package/docs/i18n/es/README.md +8 -2
- package/docs/i18n/es/auto-dialog.md +23 -0
- package/docs/i18n/es/auto-form.md +35 -0
- package/docs/i18n/es/auto-menu.md +23 -0
- package/docs/i18n/es/auto-search.md +32 -0
- package/docs/i18n/es/auto-table.md +31 -0
- package/docs/i18n/es/auto-tabs.md +25 -0
- package/docs/i18n/es/errors.md +110 -0
- package/docs/i18n/fr/README.md +8 -2
- package/docs/i18n/fr/auto-dialog.md +23 -0
- package/docs/i18n/fr/auto-form.md +35 -0
- package/docs/i18n/fr/auto-menu.md +23 -0
- package/docs/i18n/fr/auto-search.md +32 -0
- package/docs/i18n/fr/auto-table.md +31 -0
- package/docs/i18n/fr/auto-tabs.md +25 -0
- package/docs/i18n/fr/errors.md +110 -0
- package/docs/i18n/ja/README.md +8 -2
- package/docs/i18n/ja/auto-dialog.md +23 -0
- package/docs/i18n/ja/auto-form.md +36 -0
- package/docs/i18n/ja/auto-menu.md +23 -0
- package/docs/i18n/ja/auto-search.md +34 -0
- package/docs/i18n/ja/auto-table.md +31 -0
- package/docs/i18n/ja/auto-tabs.md +25 -0
- package/docs/i18n/ja/errors.md +110 -0
- package/docs/i18n/ko/README.md +8 -2
- package/docs/i18n/ko/auto-dialog.md +23 -0
- package/docs/i18n/ko/auto-form.md +35 -0
- package/docs/i18n/ko/auto-menu.md +23 -0
- package/docs/i18n/ko/auto-search.md +32 -0
- package/docs/i18n/ko/auto-table.md +31 -0
- package/docs/i18n/ko/auto-tabs.md +25 -0
- package/docs/i18n/ko/errors.md +110 -0
- package/docs/i18n/pt-BR/README.md +8 -2
- package/docs/i18n/pt-BR/auto-dialog.md +23 -0
- package/docs/i18n/pt-BR/auto-form.md +35 -0
- package/docs/i18n/pt-BR/auto-menu.md +23 -0
- package/docs/i18n/pt-BR/auto-search.md +32 -0
- package/docs/i18n/pt-BR/auto-table.md +31 -0
- package/docs/i18n/pt-BR/auto-tabs.md +25 -0
- package/docs/i18n/pt-BR/errors.md +110 -0
- package/docs/i18n/ru/README.md +8 -2
- package/docs/i18n/ru/auto-dialog.md +23 -0
- package/docs/i18n/ru/auto-form.md +35 -0
- package/docs/i18n/ru/auto-menu.md +23 -0
- package/docs/i18n/ru/auto-search.md +32 -0
- package/docs/i18n/ru/auto-table.md +31 -0
- package/docs/i18n/ru/auto-tabs.md +25 -0
- package/docs/i18n/ru/errors.md +110 -0
- package/docs/i18n/zh-CN/README.md +8 -2
- package/docs/i18n/zh-CN/auto-dialog.md +64 -0
- package/docs/i18n/zh-CN/auto-form.md +62 -0
- package/docs/i18n/zh-CN/auto-menu.md +47 -0
- package/docs/i18n/zh-CN/auto-search.md +55 -0
- package/docs/i18n/zh-CN/auto-table.md +62 -0
- package/docs/i18n/zh-CN/auto-tabs.md +99 -0
- package/docs/i18n/zh-CN/errors.md +112 -0
- package/docs/i18n/zh-TW/README.md +8 -2
- package/docs/i18n/zh-TW/auto-dialog.md +64 -0
- package/docs/i18n/zh-TW/auto-form.md +62 -0
- package/docs/i18n/zh-TW/auto-menu.md +47 -0
- package/docs/i18n/zh-TW/auto-search.md +55 -0
- package/docs/i18n/zh-TW/auto-table.md +62 -0
- package/docs/i18n/zh-TW/auto-tabs.md +44 -0
- package/docs/i18n/zh-TW/errors.md +112 -0
- package/llms.txt +69 -0
- package/package.json +18 -2
- package/dist/components/AutoSearchPanel/index.d.ts +0 -21
package/dist/style.css
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
:root{--auto-accent:#176b54;--auto-accent-soft:#e8f4ee;--auto-bg:#fff;--auto-muted:#f4f6f5;--auto-text:#202e29;--auto-secondary:#65746d;--auto-border:#dce4df;--auto-danger:#bd3545;--auto-radius:8px;--auto-font:Inter, ui-sans-serif, system-ui, sans-serif}.auto-root,.auto-overlay,.auto-popover{font-family:var(--auto-font);color:var(--auto-text);box-sizing:border-box;font-size:14px}.auto-root *,.auto-overlay *,.auto-popover *{box-sizing:border-box}.auto-root button,.auto-overlay button,.auto-popover button{font:inherit;cursor:pointer;border:1px solid var(--auto-border);background:var(--auto-bg);color:inherit;border-radius:6px;padding:7px 12px}.auto-root button:hover,.auto-overlay button:hover{background:var(--auto-muted)}.auto-root button:disabled,.auto-overlay button:disabled{opacity:.45;cursor:not-allowed}.auto-root .auto-primary,.auto-overlay .auto-primary{background:var(--auto-accent);color:var(--auto-primary-text,white);border-color:var(--auto-accent)}.auto-root input,.auto-root select,.auto-root textarea,.auto-overlay input,.auto-overlay select{font:inherit;border:1px solid var(--auto-border);background:var(--auto-bg);color:inherit;border-radius:6px;max-width:100%;padding:8px 10px}.auto-root input[aria-invalid=true],.auto-root select[aria-invalid=true],.auto-root textarea[aria-invalid=true],.auto-overlay input[aria-invalid=true],.auto-overlay select[aria-invalid=true]{border-color:var(--auto-danger)}.auto-root input[aria-invalid=true]:focus-visible,.auto-root select[aria-invalid=true]:focus-visible,.auto-root textarea[aria-invalid=true]:focus-visible,.auto-overlay input[aria-invalid=true]:focus-visible,.auto-overlay select[aria-invalid=true]:focus-visible{outline-color:var(--auto-danger)}.auto-root :focus-visible,.auto-overlay :focus-visible,.auto-popover :focus-visible{outline:2px solid var(--auto-accent);outline-offset:2px}.auto-actions{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.auto-error{color:var(--auto-danger);font-size:13px}.auto-muted{color:var(--auto-secondary)}.auto-empty{text-align:center;color:var(--auto-secondary);padding:40px}.auto-badge{background:var(--auto-accent-soft);color:var(--auto-accent);border-radius:20px;padding:3px 8px;font-size:12px;display:inline-flex}.auto-form-grid{grid-template-columns:repeat(var(--auto-columns,2), minmax(0, 1fr));gap:var(--auto-field-gap,18px);display:grid}.auto-field{flex-direction:column;gap:7px;min-width:0;display:flex}.auto-field>label{font-size:13px;font-weight:550}.auto-field>label span{color:var(--auto-danger)}.auto-field input:not([type=checkbox]):not([type=radio]),.auto-field select,.auto-field textarea{width:100%}.auto-form-actions{margin-top:22px}.auto-select-menu{border:1px solid var(--auto-border);background:var(--auto-bg);border-radius:8px;padding:8px}.auto-select-menu input{margin-bottom:8px}@media (width<=600px){.auto-form-grid{grid-template-columns:1fr}.auto-field{grid-column:1/-1!important}}.auto-search{border-bottom:1px solid var(--auto-border);padding:18px}.auto-overlay-backdrop{-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);z-index:1000;background:#13271e66;position:fixed;inset:0}.auto-overlay{background:var(--auto-bg);border:1px solid var(--auto-border);z-index:1001;border-radius:12px;flex-direction:column;max-width:calc(100vw - 32px);max-height:90vh;display:flex;position:fixed;top:50%;left:50%;box-shadow:0 24px 80px #0b261e40}.auto-dialog-header{border-bottom:1px solid var(--auto-border);touch-action:none;justify-content:space-between;align-items:center;padding:18px 22px;display:flex}.auto-dialog-header h2{margin:0;font-size:18px}.auto-dialog-body{padding:24px;overflow:auto}.auto-dialog-footer{border-top:1px solid var(--auto-border);justify-content:flex-end;padding:16px 22px}.auto-dialog-full{max-width:none;max-height:none;inset:16px;transform:none}.auto-tabs-heading{border-bottom:1px solid var(--auto-border);justify-content:space-between;gap:12px;display:flex}.auto-tab-list{gap:4px;display:flex;overflow:auto}.auto-tab-list button{white-space:nowrap;background:0 0;border:0;border-bottom:2px solid #0000;border-radius:0;padding:12px 18px}.auto-tab-list button[data-state=active]{color:var(--auto-accent);border-bottom-color:var(--auto-accent);background:var(--auto-accent-soft)}.auto-tab-badge{background:var(--auto-accent-soft);color:var(--auto-accent);border-radius:10px;justify-content:center;align-items:center;margin-left:6px;padding:1px 6px;font-size:11px;font-weight:600;line-height:16px;display:inline-flex}.auto-tab-content{min-width:0;padding:20px 0}.auto-tab-content[hidden]{display:none}.auto-tabs-vertical{grid-template-columns:170px minmax(0,1fr);gap:20px;display:grid}.auto-tabs-vertical>.auto-tabs-heading{border:0}.auto-tabs-vertical>.auto-tabs-heading .auto-tab-list{flex-direction:column;width:100%}.auto-table{border:1px solid var(--auto-border);background:var(--auto-bg);border-radius:10px;overflow:hidden}.auto-toolbar{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:16px;padding:16px 18px;display:flex}.auto-toolbar strong{font-size:16px}.auto-table table{border-spacing:0;border-collapse:separate}.auto-table th,.auto-table td{border-bottom:1px solid var(--auto-border);text-overflow:ellipsis;white-space:nowrap;padding:8px 12px;overflow:hidden}.auto-table th{height:42px;font-size:12px;font-weight:550;top:0;background:var(--auto-muted)!important;z-index:4!important;position:sticky!important}.auto-table tbody tr:hover td{background:var(--auto-accent-soft)!important}.auto-table tbody tr.auto-current td{background:var(--auto-accent-soft)}.auto-table tfoot td{font-weight:600;position:sticky;bottom:0;background:var(--auto-muted)!important}.auto-table th.auto-table-cell-selection,.auto-table td.auto-table-cell-selection,.auto-table th:first-child,.auto-table tbody>tr>td:first-child:not([colspan]){text-align:center;width:44px;min-width:44px;max-width:44px;padding-left:0!important;padding-right:0!important}.auto-table tfoot td:first-child{text-align:center;white-space:nowrap;padding:8px 4px;overflow:visible}.auto-table progress{accent-color:var(--auto-accent);border-radius:4px;width:100%;min-width:60px;height:6px}.auto-column-heading{align-items:center;gap:2px;display:flex;position:relative}.auto-column-heading button{text-align:left;background:0 0;border:0;padding:0;font-size:12px}.auto-column-heading button:disabled{opacity:1;color:inherit;cursor:default}.auto-column-heading button.auto-filter-active{color:var(--auto-accent);background:var(--auto-accent-soft);border-radius:4px;padding:1px 4px;font-weight:700}.auto-resize{cursor:col-resize;touch-action:none;border-right:2px solid #0000;width:6px;position:absolute;top:-10px;bottom:-10px;right:-10px}.auto-resize:hover{border-color:var(--auto-accent)}.auto-cell{align-items:center;gap:6px;min-height:22px;display:flex}.auto-expand{padding:0 5px!important}.auto-pagination{border-top:1px solid var(--auto-border);justify-content:space-between;align-items:center;padding:12px 18px;font-size:12px;display:flex}.auto-sort-tags{padding:0 18px 12px}.auto-sort-tags button{background:var(--auto-accent-soft);border:0;font-size:12px}.auto-json{max-height:500px;padding:18px;overflow:auto}.auto-json pre{font-size:12px}.auto-notice{background:var(--auto-accent-soft);justify-content:space-between;padding:8px 18px;display:flex}.auto-filter-options{flex-direction:column;min-width:150px;max-height:300px;display:flex;overflow:auto}.auto-filter-options button{justify-content:space-between;gap:12px;display:flex}.auto-settings{min-width:0}.auto-preset{border-bottom:1px solid var(--auto-border);margin:18px 0;padding-bottom:18px}.auto-setting-row{border-bottom:1px solid var(--auto-border);align-items:center;gap:8px;padding:8px 0;display:flex}.auto-setting-row>label{flex:1}.auto-setting-row>input[type=number]{width:80px}.auto-settings textarea{font-family:monospace}.auto-context-menu [role=menuitem]{cursor:pointer;border-radius:4px;padding:8px 16px}.auto-context-menu [data-highlighted]{background:var(--auto-accent-soft)}.auto-context-menu [data-disabled]{opacity:.4}.auto-skeleton{color:var(--auto-secondary);animation:1s infinite auto-pulse}@keyframes auto-pulse{50%{opacity:.3}}.auto-table[data-height=auto]{flex-direction:column;flex:1;min-width:0;height:100%;min-height:0;display:flex}.auto-table[data-height=auto]>*{flex-shrink:0}.auto-table[data-height=auto]>.auto-table-scroll,.auto-table[data-height=auto]>.auto-json{flex:1;min-height:0;max-height:none;overflow:auto}.auto-field-control{flex-direction:column;gap:4px;min-width:0;display:flex}.auto-field-control>input[type=checkbox],.auto-field-control>input[type=radio]{align-self:flex-start}.auto-form[data-label-position=left]>.auto-form-grid>.auto-field[data-field]{grid-template-columns:var(--auto-label-width,96px) minmax(0, 1fr);align-items:start;column-gap:8px;display:grid}.auto-form[data-label-position=left]>.auto-form-grid>.auto-field>label{text-align:right;overflow-wrap:anywhere;padding-top:8px;line-height:20px}.auto-form[data-label-position=left][data-label-width=auto]>.auto-form-grid>.auto-field[data-field]{grid-template-columns:minmax(0, min(var(--auto-label-width,96px), 45%)) minmax(0, 1fr)}.auto-form[data-density=compact]{--auto-field-gap:10px 16px}.auto-form[data-density=compact]>.auto-form-grid>.auto-field{gap:4px 8px}.auto-form[data-density=compact][data-label-position=left]>.auto-form-grid>.auto-field>label{padding-top:6px}.auto-form[data-density=compact] .auto-field input:not([type=checkbox]):not([type=radio]),.auto-form[data-density=compact] .auto-field select,.auto-form[data-density=compact] .auto-field textarea{min-height:var(--auto-compact-control-height,32px);padding:var(--auto-compact-control-padding,5px 8px);font-size:var(--auto-compact-control-font,13px);line-height:20px}.auto-form[data-density=compact]>.auto-form-actions{margin-top:12px}.auto-search[data-density=compact]{padding:12px 16px}.auto-search[data-density=compact]>.auto-form{flex-wrap:wrap;align-items:flex-start;gap:10px 16px;display:flex}.auto-search[data-density=compact]>.auto-form>.auto-form-grid{flex:540px;min-width:0}.auto-search[data-density=compact]>.auto-form>.auto-form-actions{flex:none;margin-top:0}.auto-search[data-density=compact]>.auto-form>.auto-form-actions>button{min-height:var(--auto-compact-control-height,32px);padding:var(--auto-compact-control-padding,5px 10px);font-size:var(--auto-compact-control-font,13px);line-height:20px}.auto-form[data-label-align=left]>.auto-form-grid>.auto-field>label{text-align:left}.auto-form[data-label-align=right]>.auto-form-grid>.auto-field>label{text-align:right}.auto-search[data-label-width=auto]>.auto-form[data-label-position=left]>.auto-form-grid>.auto-field[data-field]{grid-template-columns:fit-content(45%) minmax(0,1fr)}.auto-root[data-size],.auto-overlay[data-size]{--auto-control-font:14px;--auto-control-height:0px;--auto-control-radius:6px;--auto-button-padding:7px 12px;--auto-input-padding:8px 10px;--auto-compact-control-height:32px;--auto-compact-control-padding:5px 8px;--auto-compact-control-font:13px}.auto-root[data-size=small],.auto-overlay[data-size=small]{--auto-control-font:12px;--auto-control-height:26px;--auto-control-radius:4px;--auto-button-padding:4px 8px;--auto-input-padding:4px 8px;--auto-compact-control-height:26px;--auto-compact-control-padding:4px 8px;--auto-compact-control-font:12px}.auto-root[data-size=large],.auto-overlay[data-size=large]{--auto-control-font:15px;--auto-control-height:42px;--auto-control-radius:8px;--auto-button-padding:10px 18px;--auto-input-padding:10px 14px;--auto-compact-control-height:42px;--auto-compact-control-padding:10px 14px;--auto-compact-control-font:15px}.auto-root[data-size] button:where(:not(.auto-tab-list button,.auto-menu button,.auto-column-heading button)),.auto-overlay[data-size] button:where(:not(.auto-tab-list button,.auto-menu button,.auto-column-heading button)){padding:var(--auto-button-padding);font-size:var(--auto-control-font);min-height:var(--auto-control-height);border-radius:var(--auto-control-radius)}.auto-root[data-size] input:not([type=checkbox]):not([type=radio]),.auto-root[data-size] select,.auto-root[data-size] textarea,.auto-overlay[data-size] input:not([type=checkbox]):not([type=radio]),.auto-overlay[data-size] select{padding:var(--auto-input-padding);font-size:var(--auto-control-font);min-height:var(--auto-control-height);border-radius:var(--auto-control-radius)}[data-size=small],.auto-form[data-size=small]>.auto-form-grid>.auto-field>label{font-size:12px}.auto-tabs[data-size=small]>.auto-tabs-heading>.auto-tab-list button{padding:6px 12px;font-size:12px}.auto-tabs[data-size=small]>.auto-tabs-heading>.auto-tab-list .auto-tab-badge{padding:0 4px;font-size:10px;line-height:14px}.auto-tabs[data-size=small]>.auto-tab-content{padding:12px 0}.auto-table[data-size=small]{font-size:12px}.auto-table[data-size=small]>.auto-table-scroll>table>:is(thead,tbody,tfoot)>tr>th{height:32px;font-size:11px}.auto-table[data-size=small]>.auto-table-scroll>table>:is(thead,tbody,tfoot)>tr>th,.auto-table[data-size=small]>.auto-table-scroll>table>:is(thead,tbody,tfoot)>tr>td{padding:4px 8px}.auto-table[data-size=small]>.auto-toolbar{gap:8px;padding:8px 12px}.auto-table[data-size=small]>.auto-toolbar strong{font-size:14px}.auto-table[data-size=small]>.auto-pagination{padding:8px 12px;font-size:11px}.auto-overlay[data-size=small] .auto-dialog-header{padding:12px 16px}.auto-overlay[data-size=small] .auto-dialog-header h2{font-size:15px}.auto-overlay[data-size=small] .auto-dialog-body{padding:16px}.auto-overlay[data-size=small] .auto-dialog-footer{padding:10px 16px}[data-size=large]{font-size:15px}.auto-form[data-size=large]>.auto-form-grid>.auto-field>label{font-size:14px}.auto-tabs[data-size=large]>.auto-tabs-heading>.auto-tab-list button{padding:15px 24px;font-size:15px}.auto-tabs[data-size=large]>.auto-tabs-heading>.auto-tab-list .auto-tab-badge{padding:2px 8px;font-size:12px;line-height:18px}.auto-tabs[data-size=large]>.auto-tab-content{padding:24px 0}.auto-table[data-size=large]{font-size:14px}.auto-table[data-size=large]>.auto-table-scroll>table>:is(thead,tbody,tfoot)>tr>th{height:48px;font-size:13px}.auto-table[data-size=large]>.auto-table-scroll>table>:is(thead,tbody,tfoot)>tr>th,.auto-table[data-size=large]>.auto-table-scroll>table>:is(thead,tbody,tfoot)>tr>td{padding:12px 16px}.auto-table[data-size=large]>.auto-toolbar{gap:16px;padding:18px 22px}.auto-table[data-size=large]>.auto-toolbar strong{font-size:18px}.auto-table[data-size=large]>.auto-pagination{padding:16px 22px;font-size:13px}.auto-overlay[data-size=large] .auto-dialog-header{padding:20px 24px}.auto-overlay[data-size=large] .auto-dialog-header h2{font-size:20px}.auto-overlay[data-size=large] .auto-dialog-body{padding:28px}.auto-overlay[data-size=large] .auto-dialog-footer{padding:18px 24px}.auto-tabs[data-density=compact]>.auto-tabs-heading>.auto-tab-list button{padding-top:6px;padding-bottom:6px}.auto-tabs[data-density=compact]>.auto-tab-content{padding:10px 0}.auto-table[data-density=compact]>.auto-table-scroll>table>:is(thead,tbody,tfoot)>tr>th{height:32px}.auto-table[data-density=compact]>.auto-table-scroll>table>:is(thead,tbody,tfoot)>tr>th,.auto-table[data-density=compact]>.auto-table-scroll>table>:is(thead,tbody,tfoot)>tr>td{padding-top:4px;padding-bottom:4px}.auto-table[data-density=compact]>.auto-toolbar{padding-top:10px;padding-bottom:10px}.auto-table[data-density=compact]>.auto-pagination{padding-top:8px;padding-bottom:8px}.auto-table[data-density=comfortable]>.auto-table-scroll>table>:is(thead,tbody,tfoot)>tr>th{height:48px}.auto-table[data-density=comfortable]>.auto-table-scroll>table>:is(thead,tbody,tfoot)>tr>th,.auto-table[data-density=comfortable]>.auto-table-scroll>table>:is(thead,tbody,tfoot)>tr>td{padding-top:12px;padding-bottom:12px}.auto-table[data-density=comfortable]>.auto-toolbar{padding-top:18px;padding-bottom:18px}.auto-table[data-density=comfortable]>.auto-pagination{padding-top:14px;padding-bottom:14px}.auto-table input[type=checkbox],.auto-table input[type=radio]{vertical-align:middle;margin:0}.auto-table[data-density=compact]>.auto-table-scroll>table>tbody>tr>td>.auto-cell{min-height:0}.auto-row-actions{flex-wrap:nowrap}.auto-menu{min-width:0;height:100%;min-height:0;color:var(--auto-text);box-sizing:border-box;flex-direction:column;gap:4px;display:flex}.auto-menu-header,.auto-menu-label,.auto-menu-footer,.auto-menu-collapse-btn{flex-shrink:0}.auto-menu-label{letter-spacing:1.5px;text-transform:uppercase;color:var(--auto-secondary);opacity:.85;-webkit-user-select:none;user-select:none;margin:14px 10px 6px;font-size:10px;font-weight:600}.auto-menu-list{scrollbar-width:thin;scrollbar-color:var(--auto-border) transparent;-webkit-overflow-scrolling:touch;flex-direction:column;flex:auto;gap:4px;min-height:0;margin:0;padding:0;list-style:none;display:flex;overflow:hidden auto}.auto-menu-item{flex-direction:column;min-width:0;display:flex}.auto-menu [data-auto-menu-item]{text-align:left;width:100%;min-width:0;min-height:40px;color:var(--auto-secondary);border-radius:var(--auto-radius,8px);font-size:var(--auto-control-font,14px);cursor:pointer;box-sizing:border-box;background:0 0;border:0;align-items:center;gap:12px;padding:9px 12px;line-height:1.3;text-decoration:none;transition:background-color .12s,color .12s;display:flex;position:relative}.auto-menu [data-auto-menu-item]:hover:not(:disabled){background:var(--auto-muted);color:var(--auto-text)}.auto-menu [data-auto-menu-item].active,.auto-menu [data-auto-menu-item][aria-current=page]{background:var(--auto-accent-soft);color:var(--auto-accent);font-weight:600}.auto-menu [data-auto-menu-item].active .auto-menu-icon,.auto-menu [data-auto-menu-item][aria-current=page] .auto-menu-icon{color:var(--auto-accent)}.auto-menu [data-auto-menu-item].active .auto-menu-text small,.auto-menu [data-auto-menu-item][aria-current=page] .auto-menu-text small{color:var(--auto-accent);opacity:.85}.auto-menu [data-auto-menu-item][data-active-branch=true]:not(.active):not([aria-current=page]){color:var(--auto-text);font-weight:550}.auto-menu [data-auto-menu-item][data-active-branch=true] .auto-menu-icon,.auto-menu [data-auto-menu-item][data-active-branch=true] .auto-menu-arrow{color:var(--auto-accent)}.auto-menu [data-auto-menu-item]:focus-visible,.auto-menu-collapse-btn:focus-visible{outline:2px solid var(--auto-accent);outline-offset:-2px;box-shadow:0 0 0 2px var(--auto-accent-soft)}.auto-menu [data-auto-menu-item]:disabled{opacity:.42;cursor:not-allowed}.auto-menu [data-auto-menu-item]:disabled:hover{color:var(--auto-secondary);background:0 0}.auto-menu-icon{flex-shrink:0;place-items:center;width:22px;height:22px;font-size:19px;line-height:1;display:grid}.auto-menu-text{overflow-wrap:break-word;word-break:break-word;flex-direction:column;flex:auto;min-width:0;font-size:13px;font-weight:600;line-height:1.3;display:flex}.auto-menu-text small{color:inherit;opacity:.72;overflow-wrap:break-word;word-break:break-word;margin-top:2px;font-size:11px;font-weight:400;line-height:1.25;display:block}.auto-menu-badge{background:var(--auto-accent-soft);color:var(--auto-accent);border-radius:10px;flex-shrink:0;justify-content:center;align-items:center;min-width:18px;height:18px;padding:1px 6px;font-size:11px;font-weight:600;line-height:1.3;display:inline-flex}.auto-menu [data-auto-menu-item].active .auto-menu-badge,.auto-menu [data-auto-menu-item][aria-current=page] .auto-menu-badge{background:var(--auto-accent);color:#fff}.auto-menu-arrow{color:var(--auto-secondary);flex-shrink:0;margin-left:auto;font-size:.75em;line-height:1;transition:transform .15s}.auto-menu-arrow-open{transform:rotate(180deg)}.auto-menu:not(.auto-menu-flyout) .auto-menu-list .auto-menu-list{border-left:1px solid var(--auto-border);flex:none;gap:3px;margin:3px 0 4px 18px;padding-left:12px;overflow:visible}.auto-menu:not(.auto-menu-flyout) .auto-menu-list .auto-menu-list [data-auto-menu-item]{font-size:calc(var(--auto-control-font,14px) * .93);gap:10px;min-height:34px;padding:6px 10px}.auto-menu:not(.auto-menu-flyout) .auto-menu-list .auto-menu-list [data-auto-menu-item] .auto-menu-text{font-size:12px;font-weight:500}.auto-menu-footer{border-top:1px solid var(--auto-border);flex-shrink:0;margin-top:auto;padding:14px 10px 4px}.auto-menu-footer>.sidebar-footer{border-top:none;margin-top:0;padding:0}.auto-menu-collapse-btn{border-radius:var(--auto-radius,8px);width:32px;height:32px;min-height:32px;color:var(--auto-secondary);border:1px solid var(--auto-border);cursor:pointer;box-sizing:border-box;background:0 0;flex-shrink:0;justify-content:center;align-self:flex-end;align-items:center;margin:4px 6px;padding:0;font-size:13px;line-height:1;transition:background-color .12s,color .12s,border-color .12s;display:inline-flex}.auto-menu-collapse-btn:hover:not(:disabled){background:var(--auto-muted);color:var(--auto-text);border-color:var(--auto-secondary)}.auto-menu[data-collapsed=true]{align-items:center;gap:6px}.auto-menu[data-collapsed=true] .auto-menu-list{align-items:center;gap:4px;width:100%}.auto-menu[data-collapsed=true] .auto-menu-item{align-items:center;width:100%}.auto-menu[data-collapsed=true] [data-auto-menu-item]{border-radius:var(--auto-radius,8px);justify-content:center;width:42px;height:42px;min-height:42px;margin:0 auto;padding:0}.auto-menu[data-collapsed=true] [data-auto-menu-item] .auto-menu-icon{width:auto;height:auto;font-size:15px;font-weight:600}.auto-menu[data-collapsed=true] [data-auto-menu-item][data-active-branch=true]{background:var(--auto-accent-soft);color:var(--auto-accent);font-weight:600}.auto-menu[data-collapsed=true] .auto-menu-label{visibility:hidden;height:0;margin:0;overflow:hidden}.auto-menu[data-collapsed=true] .auto-menu-collapse-btn{align-self:center;width:36px;height:36px;min-height:36px;margin:6px auto}.auto-menu[data-collapsed=true] .auto-menu-footer{text-align:center;width:100%;padding:8px 4px}.auto-menu[data-size=small] [data-auto-menu-item]{gap:10px;min-height:34px;padding:6px 10px;font-size:12px}.auto-menu[data-size=small] .auto-menu-icon{width:18px;height:18px;font-size:16px}.auto-menu[data-size=small] .auto-menu-text{font-size:12px}.auto-menu[data-size=small] .auto-menu-text small{font-size:10.5px}.auto-menu[data-size=small] .auto-menu-list .auto-menu-list{margin-left:14px;padding-left:10px}.auto-menu[data-size=large] [data-auto-menu-item]{gap:14px;min-height:48px;padding:11px 16px;font-size:15px}.auto-menu[data-size=large] .auto-menu-icon{width:24px;height:24px;font-size:21px}.auto-menu[data-size=large] .auto-menu-text{font-size:14.5px}.auto-menu[data-size=large] .auto-menu-text small{font-size:12px}.auto-menu[data-size=small][data-collapsed=true] [data-auto-menu-item]{width:34px;height:34px;min-height:34px}.auto-menu[data-size=large][data-collapsed=true] [data-auto-menu-item]{width:46px;height:46px;min-height:46px}.auto-menu[data-density=compact],.auto-menu[data-density=compact] .auto-menu-list{gap:2px}.auto-menu[data-density=compact] [data-auto-menu-item]{gap:10px;min-height:34px;padding-top:5px;padding-bottom:5px}.auto-menu[data-density=compact][data-collapsed=true] [data-auto-menu-item]{width:36px;height:36px;min-height:36px}.auto-popover:has(.auto-menu-flyout){border-radius:var(--auto-radius,8px);padding:4px}.auto-menu.auto-menu-flyout{gap:2px;width:220px;min-width:190px;max-width:min(300px,100vw - 24px);height:auto;max-height:min(440px,100dvh - 32px,100vh - 32px);overflow:hidden}.auto-menu-flyout .auto-menu-label{letter-spacing:.06em;text-transform:uppercase;color:var(--auto-secondary);margin:6px 10px 4px;font-size:11px;font-weight:600}.auto-menu-flyout>.auto-menu-list{border-left:none;flex:auto;min-height:0;margin:0;padding:0;overflow:hidden auto}.auto-menu-flyout>.auto-menu-list>.auto-menu-item>[data-auto-menu-item]{font-size:var(--auto-control-font,14px);min-height:34px;padding:7px 10px}.auto-menu-flyout .auto-menu-list .auto-menu-list{border-left:1px solid var(--auto-border);flex:none;gap:2px;margin:2px 0 3px 14px;padding-left:10px;overflow:visible}.auto-menu-flyout .auto-menu-list .auto-menu-list [data-auto-menu-item]{font-size:calc(var(--auto-control-font,14px) * .93);min-height:32px;padding:5px 8px}.auto-popover .auto-menu-flyout [data-auto-menu-item]{color:var(--auto-secondary);border-radius:var(--auto-radius,8px);background:0 0;border:0}.auto-popover .auto-menu-flyout [data-auto-menu-item]:hover:not(:disabled){background:var(--auto-muted);color:var(--auto-text)}.auto-popover .auto-menu-flyout [data-auto-menu-item].active,.auto-popover .auto-menu-flyout [data-auto-menu-item][aria-current=page]{background:var(--auto-accent-soft);color:var(--auto-accent);font-weight:600}@media (prefers-reduced-motion:reduce){.auto-menu-arrow,.auto-menu [data-auto-menu-item],.auto-menu-collapse-btn{transition:none!important}}.auto-popover{z-index:1100;box-sizing:border-box;background:var(--auto-bg);width:max-content;color:var(--auto-text);border:1px solid var(--auto-border);max-width:min(420px, calc(100vw - 16px), var(--auto-popover-available-width,420px));max-height:var(--auto-popover-available-height,calc(100vh - 24px));border-radius:8px;flex-direction:column;padding:14px;display:flex;box-shadow:0 4px 16px #0000001f}.auto-popover-body{overflow-wrap:anywhere;flex:auto;min-width:0;min-height:0;overflow:auto}.auto-chat{--auto-chat-avatar:2rem;--auto-chat-pad:.75rem 1rem;--auto-chat-gap:1rem;background:var(--auto-bg);height:100%;min-height:0;color:var(--auto-text);border:1px solid var(--auto-border);box-sizing:border-box;border-radius:.5rem;flex-direction:column;display:flex;position:relative}.auto-chat,.auto-chat *{box-sizing:border-box}.auto-chat[data-size=small]{--auto-chat-avatar:1.5rem;font-size:.8125rem}.auto-chat[data-size=large]{--auto-chat-avatar:2.5rem;font-size:1.0625rem}.auto-chat[data-density=compact]{--auto-chat-pad:.5rem .75rem;--auto-chat-gap:.5rem}.auto-chat .auto-chat-header{padding:var(--auto-chat-pad);border-bottom:1px solid var(--auto-border);flex-shrink:0;justify-content:space-between;align-items:center;display:flex}.auto-chat .auto-chat-history-shell{flex-direction:column;flex:1;min-height:0;display:flex;position:relative}.auto-chat .auto-chat-history{overflow-anchor:none;min-height:0;padding:var(--auto-chat-pad);gap:var(--auto-chat-gap);flex-direction:column;flex:1;display:flex;overflow:hidden auto}.auto-chat .auto-chat-history-start{flex-shrink:0;justify-content:center;display:flex}.auto-root.auto-chat .auto-chat-history-start button{background:var(--auto-muted);color:var(--auto-secondary);border:1px solid var(--auto-border);cursor:pointer;border-radius:.25rem;padding:.25rem .75rem}.auto-root.auto-chat .auto-chat-history-start button:hover{background:var(--auto-accent-soft);color:var(--auto-accent);border-color:var(--auto-accent)}.auto-chat .auto-chat-empty{color:var(--auto-secondary);text-align:center;margin:auto;padding:2rem 1rem}.auto-chat .auto-chat-messages{gap:var(--auto-chat-gap);flex-direction:column;flex-shrink:0;margin:0;padding:0;list-style:none;display:flex}.auto-root.auto-chat button.auto-chat-latest{z-index:5;background:var(--auto-bg);color:var(--auto-text);border:1px solid var(--auto-border);box-shadow:0 2px 8px color-mix(in srgb, var(--auto-text) 12%, transparent);cursor:pointer;border-radius:9999px;align-items:center;gap:.375rem;padding:.35rem .75rem;display:inline-flex;position:absolute;bottom:.75rem;right:1rem}.auto-root.auto-chat button.auto-chat-latest:hover{background:var(--auto-accent-soft);color:var(--auto-accent);border-color:var(--auto-accent)}.auto-chat .auto-chat-message{align-items:flex-start;gap:.625rem;min-width:0;max-width:100%;display:flex}.auto-chat .auto-chat-avatar{width:var(--auto-chat-avatar);height:var(--auto-chat-avatar);background:var(--auto-muted);color:var(--auto-secondary);font-size:calc(var(--auto-chat-avatar) * .45);border:1px solid var(--auto-border);border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;font-weight:600;display:inline-flex;overflow:hidden}.auto-chat .auto-chat-avatar>*{object-fit:cover;width:100%;height:100%}.auto-chat .auto-chat-message-main{flex-direction:column;flex:auto;gap:.25rem;min-width:0;display:flex}.auto-chat .auto-chat-message-meta{color:var(--auto-secondary);align-items:center;gap:.5rem;font-size:.8125em;display:flex}.auto-chat .auto-chat-message-meta strong{color:var(--auto-text);font-weight:600}.auto-chat .auto-chat-streaming{color:var(--auto-accent);align-items:center;gap:.25rem;display:inline-flex}.auto-chat .auto-chat-streaming:after{content:"";background:var(--auto-accent);border-radius:50%;width:.45em;height:.45em;animation:1.2s ease-in-out infinite auto-chat-pulse}@keyframes auto-chat-pulse{0%,to{opacity:.3;transform:scale(.8)}50%{opacity:1;transform:scale(1.1)}}.auto-chat .auto-chat-message-body{-webkit-user-select:text;user-select:text;overflow-wrap:anywhere;word-break:break-word;min-width:0}.auto-chat .auto-chat-text{white-space:pre-wrap}.auto-chat .auto-chat-message-body pre{white-space:pre;background:var(--auto-muted);border:1px solid var(--auto-border);border-radius:.375rem;max-width:100%;margin:.375rem 0;padding:.5rem .75rem;overflow-x:auto}.auto-chat .auto-chat-message-body table{border-collapse:collapse;max-width:100%;margin:.375rem 0;display:block;overflow-x:auto}.auto-chat .auto-chat-message-body th,.auto-chat .auto-chat-message-body td{border:1px solid var(--auto-border);padding:.375rem .5rem}.auto-chat .auto-chat-message-actions{align-items:center;gap:.25rem;margin-top:.25rem;display:flex}.auto-root.auto-chat .auto-chat-message-actions button{color:var(--auto-secondary);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:.25rem;padding:.2rem .4rem;font-size:.75rem}.auto-root.auto-chat .auto-chat-message-actions button:hover{background:var(--auto-muted);color:var(--auto-text);border-color:var(--auto-border)}.auto-chat .auto-chat-message[data-role=user]{flex-direction:row-reverse;align-self:flex-end;max-width:85%}.auto-chat .auto-chat-message[data-role=user] .auto-chat-message-main{align-items:flex-end}.auto-chat .auto-chat-message[data-role=user] .auto-chat-message-body{background:var(--auto-accent-soft);border:1px solid var(--auto-border);border-radius:.75rem .25rem .75rem .75rem;padding:.5rem .75rem}.auto-chat .auto-chat-message[data-role=assistant]{width:100%}.auto-chat .auto-chat-message[data-role=system]{align-self:center;max-width:85%}.auto-chat .auto-chat-message[data-role=system] .auto-chat-message-main{align-items:center}.auto-chat .auto-chat-message[data-role=system] .auto-chat-message-body{background:var(--auto-muted);color:var(--auto-secondary);border:1px solid var(--auto-border);border-radius:9999px;padding:.25rem .75rem;font-size:.8125em}.auto-chat .auto-chat-message[data-role=tool]{width:100%;font-size:.875em}.auto-chat .auto-chat-message[data-role=tool] .auto-chat-message-body{background:var(--auto-muted);color:var(--auto-secondary);border:1px solid var(--auto-border);border-left:3px solid var(--auto-secondary);border-radius:.25rem;padding:.5rem .75rem}.auto-chat .auto-chat-message[data-role=error]{width:100%}.auto-chat .auto-chat-message[data-role=error] .auto-chat-avatar{background:color-mix(in srgb, var(--auto-danger) 15%, transparent);color:var(--auto-danger);border-color:var(--auto-danger)}.auto-chat .auto-chat-message[data-role=error] .auto-chat-message-meta strong{color:var(--auto-danger)}.auto-chat .auto-chat-message[data-role=error] .auto-chat-message-body{background:color-mix(in srgb, var(--auto-danger) 8%, transparent);color:var(--auto-danger);border:1px solid var(--auto-danger);border-radius:.375rem;padding:.5rem .75rem}.auto-chat .auto-chat-status{color:var(--auto-secondary);flex-shrink:0;align-items:center;gap:.375rem;padding:.25rem 1rem;font-size:.8125em;display:flex}.auto-chat form.auto-chat-composer{padding:var(--auto-chat-pad);border-top:1px solid var(--auto-border);background:var(--auto-bg);flex-direction:column;flex-shrink:0;gap:.5rem;display:flex}.auto-chat form.auto-chat-composer textarea{width:100%;min-width:0;font-family:inherit;font-size:inherit;color:var(--auto-text);background:var(--auto-bg);border:1px solid var(--auto-border);resize:vertical;border-radius:.375rem;outline:none;min-height:4.5rem;padding:.5rem .75rem;line-height:1.4}.auto-chat form.auto-chat-composer textarea:focus{border-color:var(--auto-accent);box-shadow:0 0 0 2px color-mix(in srgb, var(--auto-accent) 25%, transparent)}.auto-chat form.auto-chat-composer textarea::placeholder{color:var(--auto-secondary);opacity:.75}.auto-chat .auto-error{color:var(--auto-danger);background:color-mix(in srgb, var(--auto-danger) 10%, transparent);border:1px solid var(--auto-danger);border-radius:.25rem;align-items:center;gap:.375rem;padding:.375rem .625rem;font-size:.8125em;display:flex}.auto-chat .auto-chat-composer-actions{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:.5rem;display:flex}.auto-chat .auto-chat-composer-actions>div:first-child{flex-wrap:wrap;align-items:center;gap:.375rem;display:flex}.auto-root.auto-chat .auto-chat-composer-actions>div:first-child button{color:var(--auto-secondary);border:1px solid var(--auto-border);cursor:pointer;background:0 0;border-radius:.25rem;padding:.35rem .625rem}.auto-root.auto-chat .auto-chat-composer-actions>div:first-child button:hover{background:var(--auto-muted);color:var(--auto-text)}.auto-root.auto-chat .auto-chat-composer-actions>button{background:var(--auto-accent);color:var(--auto-bg);border:1px solid var(--auto-accent);cursor:pointer;border-radius:.25rem;justify-content:center;align-items:center;gap:.375rem;margin-left:auto;padding:.35rem .875rem;font-weight:500;display:inline-flex}.auto-root.auto-chat .auto-chat-composer-actions>button:hover{opacity:.9}.auto-root.auto-chat .auto-chat-composer-actions>button:active{transform:scale(.98)}.auto-root.auto-chat .auto-chat-composer-actions>button[data-action=stop],.auto-root.auto-chat .auto-chat-composer-actions>button.auto-chat-stop{background:var(--auto-danger);border-color:var(--auto-danger);color:var(--auto-bg)}.auto-root.auto-chat .auto-chat-composer-actions>button:disabled{opacity:.45;cursor:not-allowed}.auto-chat .auto-chat-footer{color:var(--auto-secondary);text-align:center;border-top:1px solid var(--auto-border);flex-shrink:0;padding:.375rem 1rem;font-size:.75rem}.auto-chat .auto-chat-header:empty,.auto-chat .auto-chat-empty:empty,.auto-chat .auto-chat-status:empty,.auto-chat .auto-error:empty,.auto-chat .auto-chat-footer:empty{display:none}.auto-root.auto-chat button:focus-visible,.auto-chat textarea:focus-visible{outline:2px solid var(--auto-accent);outline-offset:2px}@media (width<=480px){.auto-chat{border-left:none;border-right:none;border-radius:0}.auto-chat .auto-chat-message[data-role=user]{max-width:92%}}.auto-chat[data-message-layout=left] .auto-chat-message,.auto-chat[data-message-layout=left] .auto-chat-message[data-role]{flex-direction:row;justify-content:flex-start;align-self:flex-start;width:fit-content;max-width:100%;margin-left:0;margin-right:auto}.auto-chat[data-message-layout=left] .auto-chat-message .auto-chat-message-main,.auto-chat[data-message-layout=left] .auto-chat-message[data-role] .auto-chat-message-main{align-items:flex-start}.auto-chat[data-message-layout=left] .auto-chat-message .auto-chat-message-meta,.auto-chat[data-message-layout=left] .auto-chat-message[data-role] .auto-chat-message-meta{text-align:left;justify-content:flex-start}.auto-chat[data-message-layout=left] .auto-chat-message .auto-chat-message-actions,.auto-chat[data-message-layout=left] .auto-chat-message[data-role] .auto-chat-message-actions{justify-content:flex-start}.auto-chat[data-message-layout=left] .auto-chat-message .auto-chat-message-body,.auto-chat[data-message-layout=left] .auto-chat-message[data-role] .auto-chat-message-body{text-align:left;min-width:0;max-width:100%}.auto-chat[data-message-layout=left] .auto-chat-message[data-role=user] .auto-chat-message-body{border-radius:.25rem .75rem .75rem}.auto-chat[data-message-layout=right] .auto-chat-message,.auto-chat[data-message-layout=right] .auto-chat-message[data-role]{flex-direction:row-reverse;justify-content:flex-start;align-self:flex-end;width:fit-content;max-width:100%;margin-left:auto;margin-right:0}.auto-chat[data-message-layout=right] .auto-chat-message .auto-chat-message-main,.auto-chat[data-message-layout=right] .auto-chat-message[data-role] .auto-chat-message-main{align-items:flex-end}.auto-chat[data-message-layout=right] .auto-chat-message .auto-chat-message-meta,.auto-chat[data-message-layout=right] .auto-chat-message[data-role] .auto-chat-message-meta{text-align:right;justify-content:flex-end}.auto-chat[data-message-layout=right] .auto-chat-message .auto-chat-message-actions,.auto-chat[data-message-layout=right] .auto-chat-message[data-role] .auto-chat-message-actions{justify-content:flex-end}.auto-chat[data-message-layout=right] .auto-chat-message .auto-chat-message-body,.auto-chat[data-message-layout=right] .auto-chat-message[data-role] .auto-chat-message-body{text-align:left;min-width:0;max-width:100%}.auto-chat[data-message-layout=right] .auto-chat-message[data-role=user] .auto-chat-message-body,.auto-chat[data-message-layout=right] .auto-chat-message[data-role=assistant] .auto-chat-message-body,.auto-chat[data-message-layout=right] .auto-chat-message[data-role=tool] .auto-chat-message-body,.auto-chat[data-message-layout=right] .auto-chat-message[data-role=error] .auto-chat-message-body{border-radius:.75rem .25rem .75rem .75rem}.auto-chat[data-message-layout=full] .auto-chat-message,.auto-chat[data-message-layout=full] .auto-chat-message[data-role]{flex-direction:row;justify-content:flex-start;align-self:stretch;width:100%;max-width:100%;margin-left:0;margin-right:0}.auto-chat[data-message-layout=full] .auto-chat-message .auto-chat-message-main,.auto-chat[data-message-layout=full] .auto-chat-message[data-role] .auto-chat-message-main{flex:auto;align-items:stretch;width:100%}.auto-chat[data-message-layout=full] .auto-chat-message .auto-chat-message-meta,.auto-chat[data-message-layout=full] .auto-chat-message[data-role] .auto-chat-message-meta{text-align:left;justify-content:flex-start}.auto-chat[data-message-layout=full] .auto-chat-message .auto-chat-message-actions,.auto-chat[data-message-layout=full] .auto-chat-message[data-role] .auto-chat-message-actions{justify-content:flex-start}.auto-chat[data-message-layout=full] .auto-chat-message .auto-chat-message-body,.auto-chat[data-message-layout=full] .auto-chat-message[data-role] .auto-chat-message-body{text-align:left;width:100%;min-width:0;max-width:100%}.auto-chat[data-message-layout=full] .auto-chat-message[data-role=user] .auto-chat-message-body,.auto-chat[data-message-layout=full] .auto-chat-message[data-role=system] .auto-chat-message-body{border-radius:.375rem}
|
|
1
|
+
:root{--auto-accent:#176b54;--auto-accent-soft:#e8f4ee;--auto-bg:#fff;--auto-muted:#f4f6f5;--auto-text:#202e29;--auto-secondary:#65746d;--auto-border:#dce4df;--auto-danger:#bd3545;--auto-radius:8px;--auto-font:Inter, ui-sans-serif, system-ui, sans-serif}.auto-root,.auto-overlay,.auto-popover{font-family:var(--auto-font);color:var(--auto-text);box-sizing:border-box;font-size:14px}.auto-root *,.auto-overlay *,.auto-popover *{box-sizing:border-box}.auto-root button,.auto-overlay button,.auto-popover button{font:inherit;cursor:pointer;border:1px solid var(--auto-border);background:var(--auto-bg);color:inherit;border-radius:6px;padding:7px 12px}.auto-root button:hover,.auto-overlay button:hover{background:var(--auto-muted)}.auto-root button:disabled,.auto-overlay button:disabled{opacity:.45;cursor:not-allowed}.auto-root .auto-primary,.auto-overlay .auto-primary{background:var(--auto-accent);color:var(--auto-primary-text,white);border-color:var(--auto-accent)}.auto-root input,.auto-root select,.auto-root textarea,.auto-overlay input,.auto-overlay select{font:inherit;border:1px solid var(--auto-border);background:var(--auto-bg);color:inherit;border-radius:6px;max-width:100%;padding:8px 10px}.auto-root input[aria-invalid=true],.auto-root select[aria-invalid=true],.auto-root textarea[aria-invalid=true],.auto-overlay input[aria-invalid=true],.auto-overlay select[aria-invalid=true]{border-color:var(--auto-danger)}.auto-root input[aria-invalid=true]:focus-visible,.auto-root select[aria-invalid=true]:focus-visible,.auto-root textarea[aria-invalid=true]:focus-visible,.auto-overlay input[aria-invalid=true]:focus-visible,.auto-overlay select[aria-invalid=true]:focus-visible{outline-color:var(--auto-danger)}.auto-root :focus-visible,.auto-overlay :focus-visible,.auto-popover :focus-visible{outline:2px solid var(--auto-accent);outline-offset:2px}.auto-actions{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.auto-error{color:var(--auto-danger);font-size:13px}.auto-muted{color:var(--auto-secondary)}.auto-empty{text-align:center;color:var(--auto-secondary);padding:40px}.auto-badge{background:var(--auto-accent-soft);color:var(--auto-accent);white-space:nowrap;border-radius:20px;padding:3px 8px;font-size:12px;display:inline-flex}.auto-form-grid{grid-template-columns:repeat(var(--auto-columns,2), minmax(0, 1fr));gap:var(--auto-field-gap,18px);display:grid}.auto-field{flex-direction:column;gap:7px;min-width:0;display:flex}.auto-field>label{font-size:13px;font-weight:550}.auto-field>label span{color:var(--auto-danger)}.auto-field input:not([type=checkbox]):not([type=radio]),.auto-field select,.auto-field textarea{text-overflow:ellipsis;width:100%}.auto-form-actions{margin-top:22px}.auto-select-menu{border:1px solid var(--auto-border);background:var(--auto-bg);border-radius:8px;padding:8px}.auto-select-menu input{margin-bottom:8px}@media (width<=600px){.auto-form-grid{grid-template-columns:1fr}.auto-field{grid-column:1/-1!important}}.auto-search{border-bottom:1px solid var(--auto-border);padding:18px}.auto-overlay-backdrop{-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);z-index:1000;background:#13271e66;position:fixed;inset:0}.auto-overlay{background:var(--auto-bg);border:1px solid var(--auto-border);z-index:1001;border-radius:12px;flex-direction:column;max-width:calc(100vw - 32px);max-height:90vh;display:flex;position:fixed;top:50%;left:50%;box-shadow:0 24px 80px #0b261e40}.auto-dialog-header{border-bottom:1px solid var(--auto-border);touch-action:none;justify-content:space-between;align-items:center;padding:18px 22px;display:flex}.auto-dialog-header h2{margin:0;font-size:18px}.auto-dialog-body{padding:24px;overflow:auto}.auto-dialog-footer{border-top:1px solid var(--auto-border);justify-content:flex-end;padding:16px 22px}.auto-dialog-full{max-width:none;max-height:none;inset:16px;transform:none}.auto-tabs-heading{border-bottom:1px solid var(--auto-border);justify-content:space-between;gap:12px;display:flex}.auto-tab-list{gap:4px;display:flex;overflow:auto}.auto-tab-entry{flex:none;align-items:stretch;display:flex}.auto-tab-entry>[role=tab]{flex:1}.auto-tab-list .auto-tab-entry>.auto-tab-close{padding-inline:8px}.auto-tab-entry:has([data-state=active])>.auto-tab-close{color:var(--auto-accent);background:var(--auto-accent-soft);border-bottom-color:var(--auto-accent)}.auto-tab-list button{white-space:nowrap;background:0 0;border:0;border-bottom:2px solid #0000;border-radius:0;padding:12px 18px}.auto-tab-list button[data-state=active]{color:var(--auto-accent);border-bottom-color:var(--auto-accent);background:var(--auto-accent-soft)}.auto-tab-badge{background:var(--auto-accent-soft);color:var(--auto-accent);border-radius:10px;justify-content:center;align-items:center;margin-left:6px;padding:1px 6px;font-size:11px;font-weight:600;line-height:16px;display:inline-flex}.auto-tab-content{min-width:0;padding:20px 0}.auto-tab-content[hidden]{display:none}.auto-tabs-vertical{grid-template-columns:170px minmax(0,1fr);gap:20px;display:grid}.auto-tabs-vertical>.auto-tabs-heading{border:0;flex-direction:column;align-items:stretch;gap:8px;min-width:0}.auto-tabs-vertical>.auto-tabs-heading .auto-tab-list{flex-direction:column;width:100%;overflow:visible}.auto-tabs-vertical>.auto-tabs-heading .auto-tab-list button{white-space:normal;text-align:start}.auto-tabs-vertical>.auto-tabs-heading .auto-badge{white-space:normal;justify-content:center}.auto-table{border:1px solid var(--auto-border);background:var(--auto-bg);border-radius:10px;overflow:hidden}.auto-toolbar{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:16px;padding:16px 18px;display:flex}.auto-toolbar strong{font-size:16px}.auto-table table{border-spacing:0;border-collapse:separate}.auto-table th,.auto-table td{border-bottom:1px solid var(--auto-border);text-overflow:ellipsis;white-space:nowrap;padding:8px 12px;overflow:hidden}.auto-table th{height:42px;font-size:12px;font-weight:550;top:0;background:var(--auto-muted)!important;z-index:4!important;position:sticky!important}.auto-table tbody tr:hover td{background:var(--auto-accent-soft)!important}.auto-table tbody tr.auto-current td{background:var(--auto-accent-soft)}.auto-table tfoot td{font-weight:600;position:sticky;bottom:0;background:var(--auto-muted)!important}.auto-table th.auto-table-cell-selection,.auto-table td.auto-table-cell-selection,.auto-table th:first-child,.auto-table tbody>tr>td:first-child:not([colspan]){text-align:center;width:44px;min-width:44px;max-width:44px;padding-left:0!important;padding-right:0!important}.auto-table tfoot td:first-child{text-align:center;white-space:nowrap;padding:8px 4px;overflow:visible}.auto-table progress{accent-color:var(--auto-accent);border-radius:4px;width:100%;min-width:60px;height:6px}.auto-column-heading{align-items:center;gap:2px;display:flex;position:relative}.auto-column-heading button{text-align:left;background:0 0;border:0;padding:0;font-size:12px}.auto-column-heading button:disabled{opacity:1;color:inherit;cursor:default}.auto-column-heading button.auto-filter-active{color:var(--auto-accent);background:var(--auto-accent-soft);border-radius:4px;padding:1px 4px;font-weight:700}.auto-resize{cursor:col-resize;touch-action:none;border-right:2px solid #0000;width:6px;position:absolute;top:-10px;bottom:-10px;right:-10px}.auto-resize:hover{border-color:var(--auto-accent)}.auto-cell{align-items:center;gap:6px;min-height:22px;display:flex}.auto-expand{padding:0 5px!important}.auto-pagination{border-top:1px solid var(--auto-border);justify-content:space-between;align-items:center;padding:12px 18px;font-size:12px;display:flex}.auto-sort-tags{padding:0 18px 12px}.auto-sort-tags button{background:var(--auto-accent-soft);border:0;font-size:12px}.auto-json{max-height:500px;padding:18px;overflow:auto}.auto-json pre{font-size:12px}.auto-notice{background:var(--auto-accent-soft);justify-content:space-between;padding:8px 18px;display:flex}.auto-filter-options{flex-direction:column;min-width:150px;max-height:300px;display:flex;overflow:auto}.auto-filter-options button{justify-content:space-between;gap:12px;display:flex}.auto-settings{min-width:0}.auto-preset{border-bottom:1px solid var(--auto-border);margin:18px 0;padding-bottom:18px}.auto-setting-row{border-bottom:1px solid var(--auto-border);align-items:center;gap:8px;padding:8px 0;display:flex}.auto-setting-row>label{flex:1}.auto-setting-row>input[type=number]{width:80px}.auto-settings textarea{font-family:monospace}.auto-context-menu [role=menuitem]{cursor:pointer;border-radius:4px;padding:8px 16px}.auto-context-menu [data-highlighted]{background:var(--auto-accent-soft)}.auto-context-menu [data-disabled]{opacity:.4}.auto-skeleton{color:var(--auto-secondary);animation:1s infinite auto-pulse}@keyframes auto-pulse{50%{opacity:.3}}.auto-table[data-height=auto]{flex-direction:column;flex:1;min-width:0;height:100%;min-height:0;display:flex}.auto-table[data-height=auto]>*{flex-shrink:0}.auto-table[data-height=auto]>.auto-table-scroll,.auto-table[data-height=auto]>.auto-json{flex:1;min-height:0;max-height:none;overflow:auto}.auto-field-control{flex-direction:column;gap:4px;min-width:0;display:flex}.auto-field-control>input[type=checkbox],.auto-field-control>input[type=radio]{align-self:flex-start}.auto-form[data-label-position=left]>.auto-form-grid>.auto-field[data-field]{grid-template-columns:var(--auto-label-width,96px) minmax(0, 1fr);align-items:start;column-gap:8px;display:grid}.auto-form[data-label-position=left]>.auto-form-grid>.auto-field>label{text-align:right;overflow-wrap:anywhere;padding-top:8px;line-height:20px}.auto-form[data-label-position=left][data-label-width=auto]>.auto-form-grid>.auto-field[data-field]{grid-template-columns:minmax(0, min(var(--auto-label-width,96px), 45%)) minmax(0, 1fr)}.auto-form[data-density=compact]{--auto-field-gap:10px 16px}.auto-form[data-density=compact]>.auto-form-grid>.auto-field{gap:4px 8px}.auto-form[data-density=compact][data-label-position=left]>.auto-form-grid>.auto-field>label{padding-top:6px}.auto-form[data-density=compact] .auto-field input:not([type=checkbox]):not([type=radio]),.auto-form[data-density=compact] .auto-field select,.auto-form[data-density=compact] .auto-field textarea{min-height:var(--auto-compact-control-height,32px);padding:var(--auto-compact-control-padding,5px 8px);font-size:var(--auto-compact-control-font,13px);line-height:20px}.auto-form[data-density=compact]>.auto-form-actions{margin-top:12px}.auto-search[data-density=compact]{padding:12px 16px}.auto-search[data-density=compact]>.auto-form{flex-wrap:wrap;align-items:flex-start;gap:10px 16px;display:flex}.auto-search[data-density=compact]>.auto-form>.auto-form-grid{flex:540px;min-width:0}.auto-search[data-density=compact]>.auto-form>.auto-form-actions{flex:none;margin-top:0}.auto-search[data-density=compact]>.auto-form>.auto-form-actions>button{min-height:var(--auto-compact-control-height,32px);padding:var(--auto-compact-control-padding,5px 10px);font-size:var(--auto-compact-control-font,13px);line-height:20px}.auto-form[data-label-align=left]>.auto-form-grid>.auto-field>label{text-align:left}.auto-form[data-label-align=right]>.auto-form-grid>.auto-field>label{text-align:right}.auto-search[data-label-width=auto]>.auto-form[data-label-position=left]>.auto-form-grid>.auto-field[data-field]{grid-template-columns:fit-content(45%) minmax(0,1fr)}.auto-root[data-size],.auto-overlay[data-size]{--auto-control-font:14px;--auto-control-height:0px;--auto-control-radius:6px;--auto-button-padding:7px 12px;--auto-input-padding:8px 10px;--auto-compact-control-height:32px;--auto-compact-control-padding:5px 8px;--auto-compact-control-font:13px}.auto-root[data-size=small],.auto-overlay[data-size=small]{--auto-control-font:12px;--auto-control-height:26px;--auto-control-radius:4px;--auto-button-padding:4px 8px;--auto-input-padding:4px 8px;--auto-compact-control-height:26px;--auto-compact-control-padding:4px 8px;--auto-compact-control-font:12px}.auto-root[data-size=large],.auto-overlay[data-size=large]{--auto-control-font:15px;--auto-control-height:42px;--auto-control-radius:8px;--auto-button-padding:10px 18px;--auto-input-padding:10px 14px;--auto-compact-control-height:42px;--auto-compact-control-padding:10px 14px;--auto-compact-control-font:15px}.auto-root[data-size] button:where(:not(.auto-tab-list button,.auto-menu button,.auto-column-heading button)),.auto-overlay[data-size] button:where(:not(.auto-tab-list button,.auto-menu button,.auto-column-heading button)){padding:var(--auto-button-padding);font-size:var(--auto-control-font);min-height:var(--auto-control-height);border-radius:var(--auto-control-radius)}.auto-root[data-size] input:not([type=checkbox]):not([type=radio]),.auto-root[data-size] select,.auto-root[data-size] textarea,.auto-overlay[data-size] input:not([type=checkbox]):not([type=radio]),.auto-overlay[data-size] select{padding:var(--auto-input-padding);font-size:var(--auto-control-font);min-height:var(--auto-control-height);border-radius:var(--auto-control-radius)}[data-size=small],.auto-form[data-size=small]>.auto-form-grid>.auto-field>label{font-size:12px}.auto-tabs[data-size=small]>.auto-tabs-heading>.auto-tab-list button{padding:6px 12px;font-size:12px}.auto-tabs[data-size=small]>.auto-tabs-heading>.auto-tab-list .auto-tab-badge{padding:0 4px;font-size:10px;line-height:14px}.auto-tabs[data-size=small]>.auto-tab-content{padding:12px 0}.auto-table[data-size=small]{font-size:12px}.auto-table[data-size=small]>.auto-table-scroll>table>:is(thead,tbody,tfoot)>tr>th{height:32px;font-size:11px}.auto-table[data-size=small]>.auto-table-scroll>table>:is(thead,tbody,tfoot)>tr>th,.auto-table[data-size=small]>.auto-table-scroll>table>:is(thead,tbody,tfoot)>tr>td{padding:4px 8px}.auto-table[data-size=small]>.auto-toolbar{gap:8px;padding:8px 12px}.auto-table[data-size=small]>.auto-toolbar strong{font-size:14px}.auto-table[data-size=small]>.auto-pagination{padding:8px 12px;font-size:11px}.auto-overlay[data-size=small] .auto-dialog-header{padding:12px 16px}.auto-overlay[data-size=small] .auto-dialog-header h2{font-size:15px}.auto-overlay[data-size=small] .auto-dialog-body{padding:16px}.auto-overlay[data-size=small] .auto-dialog-footer{padding:10px 16px}[data-size=large]{font-size:15px}.auto-form[data-size=large]>.auto-form-grid>.auto-field>label{font-size:14px}.auto-tabs[data-size=large]>.auto-tabs-heading>.auto-tab-list button{padding:15px 24px;font-size:15px}.auto-tabs[data-size=large]>.auto-tabs-heading>.auto-tab-list .auto-tab-badge{padding:2px 8px;font-size:12px;line-height:18px}.auto-tabs[data-size=large]>.auto-tab-content{padding:24px 0}.auto-table[data-size=large]{font-size:14px}.auto-table[data-size=large]>.auto-table-scroll>table>:is(thead,tbody,tfoot)>tr>th{height:48px;font-size:13px}.auto-table[data-size=large]>.auto-table-scroll>table>:is(thead,tbody,tfoot)>tr>th,.auto-table[data-size=large]>.auto-table-scroll>table>:is(thead,tbody,tfoot)>tr>td{padding:12px 16px}.auto-table[data-size=large]>.auto-toolbar{gap:16px;padding:18px 22px}.auto-table[data-size=large]>.auto-toolbar strong{font-size:18px}.auto-table[data-size=large]>.auto-pagination{padding:16px 22px;font-size:13px}.auto-overlay[data-size=large] .auto-dialog-header{padding:20px 24px}.auto-overlay[data-size=large] .auto-dialog-header h2{font-size:20px}.auto-overlay[data-size=large] .auto-dialog-body{padding:28px}.auto-overlay[data-size=large] .auto-dialog-footer{padding:18px 24px}.auto-tabs[data-density=compact]>.auto-tabs-heading>.auto-tab-list button{padding-top:6px;padding-bottom:6px}.auto-tabs[data-density=compact]>.auto-tab-content{padding:10px 0}.auto-table[data-density=compact]>.auto-table-scroll>table>:is(thead,tbody,tfoot)>tr>th{height:32px}.auto-table[data-density=compact]>.auto-table-scroll>table>:is(thead,tbody,tfoot)>tr>th,.auto-table[data-density=compact]>.auto-table-scroll>table>:is(thead,tbody,tfoot)>tr>td{padding-top:4px;padding-bottom:4px}.auto-table[data-density=compact]>.auto-toolbar{padding-top:10px;padding-bottom:10px}.auto-table[data-density=compact]>.auto-pagination{padding-top:8px;padding-bottom:8px}.auto-table[data-density=comfortable]>.auto-table-scroll>table>:is(thead,tbody,tfoot)>tr>th{height:48px}.auto-table[data-density=comfortable]>.auto-table-scroll>table>:is(thead,tbody,tfoot)>tr>th,.auto-table[data-density=comfortable]>.auto-table-scroll>table>:is(thead,tbody,tfoot)>tr>td{padding-top:12px;padding-bottom:12px}.auto-table[data-density=comfortable]>.auto-toolbar{padding-top:18px;padding-bottom:18px}.auto-table[data-density=comfortable]>.auto-pagination{padding-top:14px;padding-bottom:14px}.auto-table input[type=checkbox],.auto-table input[type=radio]{vertical-align:middle;margin:0}.auto-table[data-density=compact]>.auto-table-scroll>table>tbody>tr>td>.auto-cell{min-height:0}.auto-row-actions{flex-wrap:nowrap}.auto-menu{min-width:0;height:100%;min-height:0;color:var(--auto-text);box-sizing:border-box;flex-direction:column;gap:4px;display:flex}.auto-menu-header,.auto-menu-label,.auto-menu-footer,.auto-menu-collapse-btn{flex-shrink:0}.auto-menu-label{letter-spacing:1.5px;text-transform:uppercase;color:var(--auto-secondary);opacity:.85;-webkit-user-select:none;user-select:none;margin:14px 10px 6px;font-size:10px;font-weight:600}.auto-menu-list{scrollbar-width:thin;scrollbar-color:var(--auto-border) transparent;-webkit-overflow-scrolling:touch;flex-direction:column;flex:auto;gap:4px;min-height:0;margin:0;padding:0;list-style:none;display:flex;overflow:hidden auto}.auto-menu-item{flex-direction:column;min-width:0;display:flex}.auto-menu [data-auto-menu-item]{text-align:left;width:100%;min-width:0;min-height:40px;color:var(--auto-secondary);border-radius:var(--auto-radius,8px);font-size:var(--auto-control-font,14px);cursor:pointer;box-sizing:border-box;background:0 0;border:0;align-items:center;gap:12px;padding:9px 12px;line-height:1.3;text-decoration:none;transition:background-color .12s,color .12s;display:flex;position:relative}.auto-menu [data-auto-menu-item]:hover:not(:disabled){background:var(--auto-muted);color:var(--auto-text)}.auto-menu [data-auto-menu-item].active,.auto-menu [data-auto-menu-item][aria-current=page]{background:var(--auto-accent-soft);color:var(--auto-accent);font-weight:600}.auto-menu [data-auto-menu-item].active .auto-menu-icon,.auto-menu [data-auto-menu-item][aria-current=page] .auto-menu-icon{color:var(--auto-accent)}.auto-menu [data-auto-menu-item].active .auto-menu-text small,.auto-menu [data-auto-menu-item][aria-current=page] .auto-menu-text small{color:var(--auto-accent);opacity:.85}.auto-menu [data-auto-menu-item][data-active-branch=true]:not(.active):not([aria-current=page]){color:var(--auto-text);font-weight:550}.auto-menu [data-auto-menu-item][data-active-branch=true] .auto-menu-icon,.auto-menu [data-auto-menu-item][data-active-branch=true] .auto-menu-arrow{color:var(--auto-accent)}.auto-menu [data-auto-menu-item]:focus-visible,.auto-menu-collapse-btn:focus-visible{outline:2px solid var(--auto-accent);outline-offset:-2px;box-shadow:0 0 0 2px var(--auto-accent-soft)}.auto-menu [data-auto-menu-item]:disabled{opacity:.42;cursor:not-allowed}.auto-menu [data-auto-menu-item]:disabled:hover{color:var(--auto-secondary);background:0 0}.auto-menu-icon{flex-shrink:0;place-items:center;width:22px;height:22px;font-size:19px;line-height:1;display:grid}.auto-menu-text{overflow-wrap:break-word;word-break:break-word;flex-direction:column;flex:auto;min-width:0;font-size:13px;font-weight:600;line-height:1.3;display:flex}.auto-menu-text small{color:inherit;opacity:.72;overflow-wrap:break-word;word-break:break-word;margin-top:2px;font-size:11px;font-weight:400;line-height:1.25;display:block}.auto-menu-badge{background:var(--auto-accent-soft);color:var(--auto-accent);border-radius:10px;flex-shrink:0;justify-content:center;align-items:center;min-width:18px;height:18px;padding:1px 6px;font-size:11px;font-weight:600;line-height:1.3;display:inline-flex}.auto-menu [data-auto-menu-item].active .auto-menu-badge,.auto-menu [data-auto-menu-item][aria-current=page] .auto-menu-badge{background:var(--auto-accent);color:#fff}.auto-menu-arrow{color:var(--auto-secondary);flex-shrink:0;margin-left:auto;font-size:.75em;line-height:1;transition:transform .15s}.auto-menu-arrow-open{transform:rotate(180deg)}.auto-menu:not(.auto-menu-flyout) .auto-menu-list .auto-menu-list{border-left:1px solid var(--auto-border);flex:none;gap:3px;margin:3px 0 4px 18px;padding-left:12px;overflow:visible}.auto-menu:not(.auto-menu-flyout) .auto-menu-list .auto-menu-list [data-auto-menu-item]{font-size:calc(var(--auto-control-font,14px) * .93);gap:10px;min-height:34px;padding:6px 10px}.auto-menu:not(.auto-menu-flyout) .auto-menu-list .auto-menu-list [data-auto-menu-item] .auto-menu-text{font-size:12px;font-weight:500}.auto-menu-footer{border-top:1px solid var(--auto-border);flex-shrink:0;margin-top:auto;padding:14px 10px 4px}.auto-menu-footer>.sidebar-footer{border-top:none;margin-top:0;padding:0}.auto-menu-collapse-btn{border-radius:var(--auto-radius,8px);width:32px;height:32px;min-height:32px;color:var(--auto-secondary);border:1px solid var(--auto-border);cursor:pointer;box-sizing:border-box;background:0 0;flex-shrink:0;justify-content:center;align-self:flex-end;align-items:center;margin:4px 6px;padding:0;font-size:13px;line-height:1;transition:background-color .12s,color .12s,border-color .12s;display:inline-flex}.auto-menu-collapse-btn:hover:not(:disabled){background:var(--auto-muted);color:var(--auto-text);border-color:var(--auto-secondary)}.auto-menu[data-collapsed=true]{align-items:center;gap:6px}.auto-menu[data-collapsed=true] .auto-menu-list{align-items:center;gap:4px;width:100%}.auto-menu[data-collapsed=true] .auto-menu-item{align-items:center;width:100%}.auto-menu[data-collapsed=true] [data-auto-menu-item]{border-radius:var(--auto-radius,8px);justify-content:center;width:42px;height:42px;min-height:42px;margin:0 auto;padding:0}.auto-menu[data-collapsed=true] [data-auto-menu-item] .auto-menu-icon{width:auto;height:auto;font-size:15px;font-weight:600}.auto-menu[data-collapsed=true] [data-auto-menu-item][data-active-branch=true]{background:var(--auto-accent-soft);color:var(--auto-accent);font-weight:600}.auto-menu[data-collapsed=true] .auto-menu-label{visibility:hidden;height:0;margin:0;overflow:hidden}.auto-menu[data-collapsed=true] .auto-menu-collapse-btn{align-self:center;width:36px;height:36px;min-height:36px;margin:6px auto}.auto-menu[data-collapsed=true] .auto-menu-footer{text-align:center;width:100%;padding:8px 4px}.auto-menu[data-size=small] [data-auto-menu-item]{gap:10px;min-height:34px;padding:6px 10px;font-size:12px}.auto-menu[data-size=small] .auto-menu-icon{width:18px;height:18px;font-size:16px}.auto-menu[data-size=small] .auto-menu-text{font-size:12px}.auto-menu[data-size=small] .auto-menu-text small{font-size:10.5px}.auto-menu[data-size=small] .auto-menu-list .auto-menu-list{margin-left:14px;padding-left:10px}.auto-menu[data-size=large] [data-auto-menu-item]{gap:14px;min-height:48px;padding:11px 16px;font-size:15px}.auto-menu[data-size=large] .auto-menu-icon{width:24px;height:24px;font-size:21px}.auto-menu[data-size=large] .auto-menu-text{font-size:14.5px}.auto-menu[data-size=large] .auto-menu-text small{font-size:12px}.auto-menu[data-size=small][data-collapsed=true] [data-auto-menu-item]{width:34px;height:34px;min-height:34px}.auto-menu[data-size=large][data-collapsed=true] [data-auto-menu-item]{width:46px;height:46px;min-height:46px}.auto-menu[data-density=compact],.auto-menu[data-density=compact] .auto-menu-list{gap:2px}.auto-menu[data-density=compact] [data-auto-menu-item]{gap:10px;min-height:34px;padding-top:5px;padding-bottom:5px}.auto-menu[data-density=compact][data-collapsed=true] [data-auto-menu-item]{width:36px;height:36px;min-height:36px}.auto-popover:has(.auto-menu-flyout){border-radius:var(--auto-radius,8px);padding:4px}.auto-menu.auto-menu-flyout{gap:2px;width:220px;min-width:190px;max-width:min(300px,100vw - 24px);height:auto;max-height:min(440px,100dvh - 32px,100vh - 32px);overflow:hidden}.auto-menu-flyout .auto-menu-label{letter-spacing:.06em;text-transform:uppercase;color:var(--auto-secondary);margin:6px 10px 4px;font-size:11px;font-weight:600}.auto-menu-flyout>.auto-menu-list{border-left:none;flex:auto;min-height:0;margin:0;padding:0;overflow:hidden auto}.auto-menu-flyout>.auto-menu-list>.auto-menu-item>[data-auto-menu-item]{font-size:var(--auto-control-font,14px);min-height:34px;padding:7px 10px}.auto-menu-flyout .auto-menu-list .auto-menu-list{border-left:1px solid var(--auto-border);flex:none;gap:2px;margin:2px 0 3px 14px;padding-left:10px;overflow:visible}.auto-menu-flyout .auto-menu-list .auto-menu-list [data-auto-menu-item]{font-size:calc(var(--auto-control-font,14px) * .93);min-height:32px;padding:5px 8px}.auto-popover .auto-menu-flyout [data-auto-menu-item]{color:var(--auto-secondary);border-radius:var(--auto-radius,8px);background:0 0;border:0}.auto-popover .auto-menu-flyout [data-auto-menu-item]:hover:not(:disabled){background:var(--auto-muted);color:var(--auto-text)}.auto-popover .auto-menu-flyout [data-auto-menu-item].active,.auto-popover .auto-menu-flyout [data-auto-menu-item][aria-current=page]{background:var(--auto-accent-soft);color:var(--auto-accent);font-weight:600}@media (prefers-reduced-motion:reduce){.auto-menu-arrow,.auto-menu [data-auto-menu-item],.auto-menu-collapse-btn{transition:none!important}}.auto-popover{z-index:1100;box-sizing:border-box;background:var(--auto-bg);width:max-content;color:var(--auto-text);border:1px solid var(--auto-border);max-width:min(420px, calc(100vw - 16px), var(--auto-popover-available-width,420px));max-height:var(--auto-popover-available-height,calc(100vh - 24px));border-radius:8px;flex-direction:column;padding:14px;display:flex;box-shadow:0 4px 16px #0000001f}.auto-popover-body{overflow-wrap:anywhere;flex:auto;min-width:0;min-height:0;overflow:auto}.auto-chat{--auto-chat-avatar:2rem;--auto-chat-pad:.75rem 1rem;--auto-chat-gap:1rem;background:var(--auto-bg);height:100%;min-height:0;color:var(--auto-text);border:1px solid var(--auto-border);box-sizing:border-box;border-radius:.5rem;flex-direction:column;display:flex;position:relative}.auto-chat,.auto-chat *{box-sizing:border-box}.auto-chat[data-size=small]{--auto-chat-avatar:1.5rem;font-size:.8125rem}.auto-chat[data-size=large]{--auto-chat-avatar:2.5rem;font-size:1.0625rem}.auto-chat[data-density=compact]{--auto-chat-pad:.5rem .75rem;--auto-chat-gap:.5rem}.auto-chat .auto-chat-header{padding:var(--auto-chat-pad);border-bottom:1px solid var(--auto-border);flex-shrink:0;justify-content:space-between;align-items:center;display:flex}.auto-chat .auto-chat-history-shell{flex-direction:column;flex:1;min-height:0;display:flex;position:relative}.auto-chat .auto-chat-history{overflow-anchor:none;min-height:0;padding:var(--auto-chat-pad);gap:var(--auto-chat-gap);flex-direction:column;flex:1;display:flex;overflow:hidden auto}.auto-chat .auto-chat-history-start{flex-shrink:0;justify-content:center;display:flex}.auto-root.auto-chat .auto-chat-history-start button{background:var(--auto-muted);color:var(--auto-secondary);border:1px solid var(--auto-border);cursor:pointer;border-radius:.25rem;padding:.25rem .75rem}.auto-root.auto-chat .auto-chat-history-start button:hover{background:var(--auto-accent-soft);color:var(--auto-accent);border-color:var(--auto-accent)}.auto-chat .auto-chat-empty{color:var(--auto-secondary);text-align:center;margin:auto;padding:2rem 1rem}.auto-chat .auto-chat-messages{gap:var(--auto-chat-gap);flex-direction:column;flex-shrink:0;margin:0;padding:0;list-style:none;display:flex}.auto-root.auto-chat button.auto-chat-latest{z-index:5;background:var(--auto-bg);color:var(--auto-text);border:1px solid var(--auto-border);box-shadow:0 2px 8px color-mix(in srgb, var(--auto-text) 12%, transparent);cursor:pointer;border-radius:9999px;align-items:center;gap:.375rem;padding:.35rem .75rem;display:inline-flex;position:absolute;bottom:.75rem;right:1rem}.auto-root.auto-chat button.auto-chat-latest:hover{background:var(--auto-accent-soft);color:var(--auto-accent);border-color:var(--auto-accent)}.auto-chat .auto-chat-message{align-items:flex-start;gap:.625rem;min-width:0;max-width:100%;display:flex}.auto-chat .auto-chat-avatar{width:var(--auto-chat-avatar);height:var(--auto-chat-avatar);background:var(--auto-muted);color:var(--auto-secondary);font-size:calc(var(--auto-chat-avatar) * .45);border:1px solid var(--auto-border);border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;font-weight:600;display:inline-flex;overflow:hidden}.auto-chat .auto-chat-avatar>*{object-fit:cover;width:100%;height:100%}.auto-chat .auto-chat-message-main{flex-direction:column;flex:auto;gap:.25rem;min-width:0;display:flex}.auto-chat .auto-chat-message-meta{color:var(--auto-secondary);align-items:center;gap:.5rem;font-size:.8125em;display:flex}.auto-chat .auto-chat-message-meta strong{color:var(--auto-text);font-weight:600}.auto-chat .auto-chat-streaming{color:var(--auto-accent);align-items:center;gap:.25rem;display:inline-flex}.auto-chat .auto-chat-streaming:after{content:"";background:var(--auto-accent);border-radius:50%;width:.45em;height:.45em;animation:1.2s ease-in-out infinite auto-chat-pulse}@keyframes auto-chat-pulse{0%,to{opacity:.3;transform:scale(.8)}50%{opacity:1;transform:scale(1.1)}}.auto-chat .auto-chat-message-body{-webkit-user-select:text;user-select:text;overflow-wrap:anywhere;word-break:break-word;min-width:0}.auto-chat .auto-chat-text{white-space:pre-wrap}.auto-chat .auto-chat-message-body pre{white-space:pre;background:var(--auto-muted);border:1px solid var(--auto-border);border-radius:.375rem;max-width:100%;margin:.375rem 0;padding:.5rem .75rem;overflow-x:auto}.auto-chat .auto-chat-message-body table{border-collapse:collapse;max-width:100%;margin:.375rem 0;display:block;overflow-x:auto}.auto-chat .auto-chat-message-body th,.auto-chat .auto-chat-message-body td{border:1px solid var(--auto-border);padding:.375rem .5rem}.auto-chat .auto-chat-message-actions{align-items:center;gap:.25rem;margin-top:.25rem;display:flex}.auto-root.auto-chat .auto-chat-message-actions button{color:var(--auto-secondary);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:.25rem;padding:.2rem .4rem;font-size:.75rem}.auto-root.auto-chat .auto-chat-message-actions button:hover{background:var(--auto-muted);color:var(--auto-text);border-color:var(--auto-border)}.auto-chat .auto-chat-message[data-role=user]{flex-direction:row-reverse;align-self:flex-end;max-width:85%}.auto-chat .auto-chat-message[data-role=user] .auto-chat-message-main{align-items:flex-end}.auto-chat .auto-chat-message[data-role=user] .auto-chat-message-body{background:var(--auto-accent-soft);border:1px solid var(--auto-border);border-radius:.75rem .25rem .75rem .75rem;padding:.5rem .75rem}.auto-chat .auto-chat-message[data-role=assistant]{width:100%}.auto-chat .auto-chat-message[data-role=system]{align-self:center;max-width:85%}.auto-chat .auto-chat-message[data-role=system] .auto-chat-message-main{align-items:center}.auto-chat .auto-chat-message[data-role=system] .auto-chat-message-body{background:var(--auto-muted);color:var(--auto-secondary);border:1px solid var(--auto-border);border-radius:9999px;padding:.25rem .75rem;font-size:.8125em}.auto-chat .auto-chat-message[data-role=tool]{width:100%;font-size:.875em}.auto-chat .auto-chat-message[data-role=tool] .auto-chat-message-body{background:var(--auto-muted);color:var(--auto-secondary);border:1px solid var(--auto-border);border-left:3px solid var(--auto-secondary);border-radius:.25rem;padding:.5rem .75rem}.auto-chat .auto-chat-message[data-role=error]{width:100%}.auto-chat .auto-chat-message[data-role=error] .auto-chat-avatar{background:color-mix(in srgb, var(--auto-danger) 15%, transparent);color:var(--auto-danger);border-color:var(--auto-danger)}.auto-chat .auto-chat-message[data-role=error] .auto-chat-message-meta strong{color:var(--auto-danger)}.auto-chat .auto-chat-message[data-role=error] .auto-chat-message-body{background:color-mix(in srgb, var(--auto-danger) 8%, transparent);color:var(--auto-danger);border:1px solid var(--auto-danger);border-radius:.375rem;padding:.5rem .75rem}.auto-chat .auto-chat-status{color:var(--auto-secondary);flex-shrink:0;align-items:center;gap:.375rem;padding:.25rem 1rem;font-size:.8125em;display:flex}.auto-chat form.auto-chat-composer{padding:var(--auto-chat-pad);border-top:1px solid var(--auto-border);background:var(--auto-bg);flex-direction:column;flex-shrink:0;gap:.5rem;display:flex}.auto-chat form.auto-chat-composer textarea{width:100%;min-width:0;font-family:inherit;font-size:inherit;color:var(--auto-text);background:var(--auto-bg);border:1px solid var(--auto-border);resize:vertical;border-radius:.375rem;outline:none;min-height:4.5rem;padding:.5rem .75rem;line-height:1.4}.auto-chat form.auto-chat-composer textarea:focus{border-color:var(--auto-accent);box-shadow:0 0 0 2px color-mix(in srgb, var(--auto-accent) 25%, transparent)}.auto-chat form.auto-chat-composer textarea::placeholder{color:var(--auto-secondary);opacity:.75}.auto-chat .auto-error{color:var(--auto-danger);background:color-mix(in srgb, var(--auto-danger) 10%, transparent);border:1px solid var(--auto-danger);border-radius:.25rem;align-items:center;gap:.375rem;padding:.375rem .625rem;font-size:.8125em;display:flex}.auto-chat .auto-chat-composer-actions{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:.5rem;display:flex}.auto-chat .auto-chat-composer-actions>div:first-child{flex-wrap:wrap;align-items:center;gap:.375rem;display:flex}.auto-root.auto-chat .auto-chat-composer-actions>div:first-child button{color:var(--auto-secondary);border:1px solid var(--auto-border);cursor:pointer;background:0 0;border-radius:.25rem;padding:.35rem .625rem}.auto-root.auto-chat .auto-chat-composer-actions>div:first-child button:hover{background:var(--auto-muted);color:var(--auto-text)}.auto-root.auto-chat .auto-chat-composer-actions>button{background:var(--auto-accent);color:var(--auto-bg);border:1px solid var(--auto-accent);cursor:pointer;border-radius:.25rem;justify-content:center;align-items:center;gap:.375rem;margin-left:auto;padding:.35rem .875rem;font-weight:500;display:inline-flex}.auto-root.auto-chat .auto-chat-composer-actions>button:hover{opacity:.9}.auto-root.auto-chat .auto-chat-composer-actions>button:active{transform:scale(.98)}.auto-root.auto-chat .auto-chat-composer-actions>button[data-action=stop],.auto-root.auto-chat .auto-chat-composer-actions>button.auto-chat-stop{background:var(--auto-danger);border-color:var(--auto-danger);color:var(--auto-bg)}.auto-root.auto-chat .auto-chat-composer-actions>button:disabled{opacity:.45;cursor:not-allowed}.auto-chat .auto-chat-footer{color:var(--auto-secondary);text-align:center;border-top:1px solid var(--auto-border);flex-shrink:0;padding:.375rem 1rem;font-size:.75rem}.auto-chat .auto-chat-header:empty,.auto-chat .auto-chat-empty:empty,.auto-chat .auto-chat-status:empty,.auto-chat .auto-error:empty,.auto-chat .auto-chat-footer:empty{display:none}.auto-root.auto-chat button:focus-visible,.auto-chat textarea:focus-visible{outline:2px solid var(--auto-accent);outline-offset:2px}@media (width<=480px){.auto-chat{border-left:none;border-right:none;border-radius:0}.auto-chat .auto-chat-message[data-role=user]{max-width:92%}}.auto-chat[data-message-layout=left] .auto-chat-message,.auto-chat[data-message-layout=left] .auto-chat-message[data-role]{flex-direction:row;justify-content:flex-start;align-self:flex-start;width:fit-content;max-width:100%;margin-left:0;margin-right:auto}.auto-chat[data-message-layout=left] .auto-chat-message .auto-chat-message-main,.auto-chat[data-message-layout=left] .auto-chat-message[data-role] .auto-chat-message-main{align-items:flex-start}.auto-chat[data-message-layout=left] .auto-chat-message .auto-chat-message-meta,.auto-chat[data-message-layout=left] .auto-chat-message[data-role] .auto-chat-message-meta{text-align:left;justify-content:flex-start}.auto-chat[data-message-layout=left] .auto-chat-message .auto-chat-message-actions,.auto-chat[data-message-layout=left] .auto-chat-message[data-role] .auto-chat-message-actions{justify-content:flex-start}.auto-chat[data-message-layout=left] .auto-chat-message .auto-chat-message-body,.auto-chat[data-message-layout=left] .auto-chat-message[data-role] .auto-chat-message-body{text-align:left;min-width:0;max-width:100%}.auto-chat[data-message-layout=left] .auto-chat-message[data-role=user] .auto-chat-message-body{border-radius:.25rem .75rem .75rem}.auto-chat[data-message-layout=right] .auto-chat-message,.auto-chat[data-message-layout=right] .auto-chat-message[data-role]{flex-direction:row-reverse;justify-content:flex-start;align-self:flex-end;width:fit-content;max-width:100%;margin-left:auto;margin-right:0}.auto-chat[data-message-layout=right] .auto-chat-message .auto-chat-message-main,.auto-chat[data-message-layout=right] .auto-chat-message[data-role] .auto-chat-message-main{align-items:flex-end}.auto-chat[data-message-layout=right] .auto-chat-message .auto-chat-message-meta,.auto-chat[data-message-layout=right] .auto-chat-message[data-role] .auto-chat-message-meta{text-align:right;justify-content:flex-end}.auto-chat[data-message-layout=right] .auto-chat-message .auto-chat-message-actions,.auto-chat[data-message-layout=right] .auto-chat-message[data-role] .auto-chat-message-actions{justify-content:flex-end}.auto-chat[data-message-layout=right] .auto-chat-message .auto-chat-message-body,.auto-chat[data-message-layout=right] .auto-chat-message[data-role] .auto-chat-message-body{text-align:left;min-width:0;max-width:100%}.auto-chat[data-message-layout=right] .auto-chat-message[data-role=user] .auto-chat-message-body,.auto-chat[data-message-layout=right] .auto-chat-message[data-role=assistant] .auto-chat-message-body,.auto-chat[data-message-layout=right] .auto-chat-message[data-role=tool] .auto-chat-message-body,.auto-chat[data-message-layout=right] .auto-chat-message[data-role=error] .auto-chat-message-body{border-radius:.75rem .25rem .75rem .75rem}.auto-chat[data-message-layout=full] .auto-chat-message,.auto-chat[data-message-layout=full] .auto-chat-message[data-role]{flex-direction:row;justify-content:flex-start;align-self:stretch;width:100%;max-width:100%;margin-left:0;margin-right:0}.auto-chat[data-message-layout=full] .auto-chat-message .auto-chat-message-main,.auto-chat[data-message-layout=full] .auto-chat-message[data-role] .auto-chat-message-main{flex:auto;align-items:stretch;width:100%}.auto-chat[data-message-layout=full] .auto-chat-message .auto-chat-message-meta,.auto-chat[data-message-layout=full] .auto-chat-message[data-role] .auto-chat-message-meta{text-align:left;justify-content:flex-start}.auto-chat[data-message-layout=full] .auto-chat-message .auto-chat-message-actions,.auto-chat[data-message-layout=full] .auto-chat-message[data-role] .auto-chat-message-actions{justify-content:flex-start}.auto-chat[data-message-layout=full] .auto-chat-message .auto-chat-message-body,.auto-chat[data-message-layout=full] .auto-chat-message[data-role] .auto-chat-message-body{text-align:left;width:100%;min-width:0;max-width:100%}.auto-chat[data-message-layout=full] .auto-chat-message[data-role=user] .auto-chat-message-body,.auto-chat[data-message-layout=full] .auto-chat-message[data-role=system] .auto-chat-message-body{border-radius:.375rem}
|
|
2
2
|
/*$vite$:1*/
|
package/dist/xlsx.js
CHANGED
|
@@ -1,9 +1,16 @@
|
|
|
1
|
+
import { t as e } from "./errors-BT5WUIOV.js";
|
|
1
2
|
//#region src/adapters/xlsx.ts
|
|
2
|
-
async function
|
|
3
|
-
let
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
async function t(t, n) {
|
|
4
|
+
let r;
|
|
5
|
+
try {
|
|
6
|
+
r = (await import("exceljs")).default;
|
|
7
|
+
} catch {
|
|
8
|
+
throw new e("exportXlsx", "RAC-XLSX-DEP", "exceljs could not be loaded.", "Add the optional dependency with `pnpm add exceljs`, then import { exportXlsx } from \"@zeroman.yang/react-auto-components/xlsx\".", "Configure the XLSX export adapter");
|
|
9
|
+
}
|
|
10
|
+
let i = new r.Workbook(), a = i.addWorksheet(n.sheetName ?? "Data");
|
|
11
|
+
a.addRow(t.headers);
|
|
12
|
+
for (let e of t.rows) a.addRow(e.map((e) => e == null ? "" : typeof e == "object" ? JSON.stringify(e) : e));
|
|
13
|
+
return i.xlsx.writeBuffer();
|
|
7
14
|
}
|
|
8
15
|
//#endregion
|
|
9
|
-
export {
|
|
16
|
+
export { t as exportXlsx };
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# AutoDialog
|
|
2
|
+
|
|
3
|
+
**English** | [简体中文](i18n/zh-CN/auto-dialog.md) | [繁體中文](i18n/zh-TW/auto-dialog.md) | [日本語](i18n/ja/auto-dialog.md) | [한국어](i18n/ko/auto-dialog.md) | [Español](i18n/es/auto-dialog.md) | [Français](i18n/fr/auto-dialog.md) | [Deutsch](i18n/de/auto-dialog.md) | [Português (Brasil)](i18n/pt-BR/auto-dialog.md) | [Русский](i18n/ru/auto-dialog.md)
|
|
4
|
+
|
|
5
|
+
Modal dialog, either declarative (`<AutoDialog open>`) or imperative (`useAutoDialog().open()`). A `fields` list renders an [AutoForm](auto-form.md). Without fields, render `content`.
|
|
6
|
+
|
|
7
|
+
## Usage
|
|
8
|
+
|
|
9
|
+
```tsx
|
|
10
|
+
import {
|
|
11
|
+
AutoDialogProvider,
|
|
12
|
+
useAutoDialog,
|
|
13
|
+
} from "@zeroman.yang/react-auto-components";
|
|
14
|
+
import "@zeroman.yang/react-auto-components/style.css";
|
|
15
|
+
|
|
16
|
+
function EditButton() {
|
|
17
|
+
const dialog = useAutoDialog();
|
|
18
|
+
return (
|
|
19
|
+
<button
|
|
20
|
+
onClick={() =>
|
|
21
|
+
dialog.open({
|
|
22
|
+
title: "Edit",
|
|
23
|
+
fields: [{ name: "name", label: "Name", required: true }],
|
|
24
|
+
onSubmit: async (values) => save(values),
|
|
25
|
+
})
|
|
26
|
+
}
|
|
27
|
+
>
|
|
28
|
+
Edit
|
|
29
|
+
</button>
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
<AutoDialogProvider>
|
|
34
|
+
<EditButton />
|
|
35
|
+
</AutoDialogProvider>
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
`useAutoDialog()` outside the provider throws `RAC-DIALOG-PROVIDER`. The declarative `<AutoDialog open onOpenChange>` does not need the provider.
|
|
39
|
+
|
|
40
|
+
## Behavior and props
|
|
41
|
+
|
|
42
|
+
| Prop | Behavior |
|
|
43
|
+
| --- | --- |
|
|
44
|
+
| `open`, `onOpenChange` | Declarative only. `onOpenChange(false)` runs the close path. |
|
|
45
|
+
| `fields` | Schema form inside the body. Validation uses the AutoForm rules. |
|
|
46
|
+
| `content` | Used when `fields` is omitted. |
|
|
47
|
+
| `onSubmit(values)` | Called after validation passes. **Reject or throw: the dialog stays open and shows `error.message`. Values stay.** Resolve to close, then `beforeClose` still runs. |
|
|
48
|
+
| `beforeClose(reason)` | `reason` is `"submit"`, `"cancel"`, or `"close"`. **Return `false` to stay open. Throw to stay open and show the message.** |
|
|
49
|
+
| `onClose(reason)` | Called only after the dialog actually closes. |
|
|
50
|
+
| `draftKey` | Persists the draft at `${namespace}:draft:${draftKey}` until a successful submit removes it. Omit it and nothing is stored. |
|
|
51
|
+
| `showReset` | Shows the form reset control. |
|
|
52
|
+
| `hideFooter` | Hides the default confirm / cancel row. Use `footer` to draw your own. |
|
|
53
|
+
| `draggable` | Drag the header. Ignored while fullscreen. |
|
|
54
|
+
| `width` | Pixels. Default `560`. |
|
|
55
|
+
| `fullscreen` | Initial fullscreen. The header button toggles it. |
|
|
56
|
+
| `size` | Falls back to the provider size. Default `"medium"`. |
|
|
57
|
+
|
|
58
|
+
`handle.close()` from `useAutoDialog().open()` resolves `false` when `beforeClose` blocks the close.
|
|
59
|
+
|
|
60
|
+
Imperative dialogs stack. Each `open()` returns `{ id, close }`. `close(id)` closes that one.
|
|
61
|
+
|
|
62
|
+
## Preconditions
|
|
63
|
+
|
|
64
|
+
Import `style.css` once. `AutoConfigProvider` is optional. Its `namespace` is part of `draftKey` storage, and its `t` translates the built-in buttons. It is not a substitute for `AutoDialogProvider`.
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# AutoForm
|
|
2
|
+
|
|
3
|
+
**English** | [简体中文](i18n/zh-CN/auto-form.md) | [繁體中文](i18n/zh-TW/auto-form.md) | [日本語](i18n/ja/auto-form.md) | [한국어](i18n/ko/auto-form.md) | [Español](i18n/es/auto-form.md) | [Français](i18n/fr/auto-form.md) | [Deutsch](i18n/de/auto-form.md) | [Português (Brasil)](i18n/pt-BR/auto-form.md) | [Русский](i18n/ru/auto-form.md)
|
|
4
|
+
|
|
5
|
+
Schema form. Field widgets, validation, and submit live here. `AutoSearch` and `AutoDialog` render an `AutoForm` internally, so the callback rules below apply to them too.
|
|
6
|
+
|
|
7
|
+
`Field<T>` is a discriminated union on `type`. `select` without `options`, a scalar on `daterange`, and `match: "between"` on a scalar model field are TypeScript errors. `AnyField` and `unsafeField()` skip those checks; development mode still warns. Codes are in [errors.md](errors.md).
|
|
8
|
+
|
|
9
|
+
`component` is a key in `AutoConfigProvider` `config.fields`, used when `render` is absent. The field wrapper has `data-testid="rac-field-{name}"`. Submit is `rac-submit` and reset is `rac-reset`. See [llms.txt](../llms.txt).
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
```tsx
|
|
14
|
+
import { AutoForm, type Field } from "@zeroman.yang/react-auto-components";
|
|
15
|
+
import "@zeroman.yang/react-auto-components/style.css";
|
|
16
|
+
|
|
17
|
+
type Draft = { name: string; status: string };
|
|
18
|
+
const fields: Field<Draft>[] = [
|
|
19
|
+
{ name: "name", label: "Name", required: true },
|
|
20
|
+
{
|
|
21
|
+
name: "status",
|
|
22
|
+
type: "select",
|
|
23
|
+
label: "Status",
|
|
24
|
+
options: [{ value: "open", label: "Open" }],
|
|
25
|
+
},
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
<AutoForm<Draft> fields={fields} onSubmit={async (value) => save(value)} />
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Behavior and props
|
|
32
|
+
|
|
33
|
+
| Prop | Behavior |
|
|
34
|
+
| --- | --- |
|
|
35
|
+
| `fields` | `readonly Field<T>[]`. Omitted `type` is a text input. Duplicate `name` throws `RAC-FIELD-DUPLICATE` while mounting. |
|
|
36
|
+
| `value` | Controlled value. When it differs from internal state the form copies it and clears errors. If the parent ignores `onChange`, the input snaps back. |
|
|
37
|
+
| `defaultValue` | Uncontrolled seed and the reset target. Field `defaultValue` fills keys you omit. Cloned with `structuredClone`. |
|
|
38
|
+
| `onChange` | Called after every accepted edit, including patches from a field `onChange`. |
|
|
39
|
+
| `onSubmit(value)` | Called only after validation passes. Resolve to finish. **Reject or throw: values stay, `error.message` is shown under the actions, the form does not reset.** |
|
|
40
|
+
| `onReset` | Called after the reset button or `handle.reset()`. |
|
|
41
|
+
| `disabled` | Blocks edits and submit. Default `false`. |
|
|
42
|
+
| `readOnly` | Renders values without inputs. Default `false`. |
|
|
43
|
+
| `columns` | Grid columns. Default `2`. `span` is clamped to this. `lineBreak` starts a full-width row. |
|
|
44
|
+
| `actions` | Built-in submit and reset. Default `true`. Set `false` when the parent draws the buttons (search and dialog do this). |
|
|
45
|
+
| `submitLabel`, `resetLabel` | Replace the built-in labels. The defaults are translated through `config.t`. |
|
|
46
|
+
| Label props | `labelPosition` default `"top"`. `labelWidth` default `"auto"` (measured, capped at 45% of the field). `size` and `density` fall back to `AutoConfigProvider`. |
|
|
47
|
+
|
|
48
|
+
## When a callback throws
|
|
49
|
+
|
|
50
|
+
| Callback | Result |
|
|
51
|
+
| --- | --- |
|
|
52
|
+
| `onSubmit` | Caught. Draft kept. Message shown. No reset. |
|
|
53
|
+
| Field `rules` | Caught per field. The thrown message becomes that field's error. Later rules are skipped. |
|
|
54
|
+
| Field `onChange` | Not caught. The previous form value stays; the keystroke is not committed. |
|
|
55
|
+
| `upload` | Rejection is shown under the file input and nothing is stored. `reset()` aborts the `AbortSignal` and drops a late result. |
|
|
56
|
+
| Submit while an upload is in flight | `validate()` returns `false` and shows the built-in "wait for the upload" text. `onSubmit` is not called. |
|
|
57
|
+
| `hidden`, `disabled`, or failed `canAccess` | That field is not validated, even if `required`. |
|
|
58
|
+
| `required` empty | `undefined`, `null`, `""`, or an empty array blocks submit. The message is `"{label} is required"`, passed through `config.t`. |
|
|
59
|
+
|
|
60
|
+
`handle.validate()` resolves `true` or `false`. It does not throw. `handle.reset()` clears errors and upload state.
|
|
61
|
+
|
|
62
|
+
## Preconditions
|
|
63
|
+
|
|
64
|
+
Import `style.css` once. In development a missing `--auto-text` warns `RAC-CSS-MISSING`. `AutoConfigProvider` is optional. It supplies label layout, size, density, `t`, `canAccess`, and storage. It does not provide dialogs.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# AutoMenu
|
|
2
|
+
|
|
3
|
+
**English** | [简体中文](i18n/zh-CN/auto-menu.md) | [繁體中文](i18n/zh-TW/auto-menu.md) | [日本語](i18n/ja/auto-menu.md) | [한국어](i18n/ko/auto-menu.md) | [Español](i18n/es/auto-menu.md) | [Français](i18n/fr/auto-menu.md) | [Deutsch](i18n/de/auto-menu.md) | [Português (Brasil)](i18n/pt-BR/auto-menu.md) | [Русский](i18n/ru/auto-menu.md)
|
|
4
|
+
|
|
5
|
+
Sidebar. Items can nest, collapse to an icon rail, and carry an icon, description, and badge. It is navigation, not a tab panel. Use [AutoTabs](auto-tabs.md) for panels.
|
|
6
|
+
|
|
7
|
+
## Usage
|
|
8
|
+
|
|
9
|
+
```tsx
|
|
10
|
+
import { AutoMenu } from "@zeroman.yang/react-auto-components";
|
|
11
|
+
import "@zeroman.yang/react-auto-components/style.css";
|
|
12
|
+
|
|
13
|
+
<AutoMenu
|
|
14
|
+
label="Main"
|
|
15
|
+
items={[
|
|
16
|
+
{ id: "inbox", label: "Inbox" },
|
|
17
|
+
{
|
|
18
|
+
id: "settings",
|
|
19
|
+
label: "Settings",
|
|
20
|
+
children: [{ id: "profile", label: "Profile" }],
|
|
21
|
+
},
|
|
22
|
+
]}
|
|
23
|
+
onChange={(id) => navigate(id)}
|
|
24
|
+
/>
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Behavior and props
|
|
28
|
+
|
|
29
|
+
| Prop | Behavior |
|
|
30
|
+
| --- | --- |
|
|
31
|
+
| `items` | `id` must be unique in the tree. `hidden` and a failed `canAccess` drop the item. A `children` list that points at an ancestor is dropped so a bad schema cannot recurse. |
|
|
32
|
+
| `value` | Controlled selected leaf id. Omit it to keep selection internally. |
|
|
33
|
+
| `defaultValue` | Uncontrolled initial leaf. If it does not match a leaf, the first enabled leaf is selected. |
|
|
34
|
+
| `onChange(id, item, path)` | **Not caught.** `path` is the id chain from the root to the leaf. A parent with children toggles expansion instead of selecting. |
|
|
35
|
+
| `collapsible` | Default `false`. When `true`, a button toggles the icon rail. |
|
|
36
|
+
| `collapsed` | Controlled rail. Omit it to use `defaultCollapsed` (default `false`). |
|
|
37
|
+
| `onCollapsedChange` | **Not caught.** Called with the next boolean. If `collapsed` is controlled, update it yourself or the rail will not move. |
|
|
38
|
+
| `disabled` | Disables the item and its descendants. Disabled items are skipped by selection. |
|
|
39
|
+
| `label` | Group title, also the nav accessible name. |
|
|
40
|
+
| `header`, `footer` | Slots above and below the list. |
|
|
41
|
+
| `size`, `density` | Override the provider. The menu reads `config.menu`, then the global size and density. |
|
|
42
|
+
|
|
43
|
+
Keyboard movement stays inside the menu. Selecting a leaf does not navigate by itself; `onChange` is the only signal.
|
|
44
|
+
|
|
45
|
+
## Preconditions
|
|
46
|
+
|
|
47
|
+
Import `style.css` once (`RAC-CSS-MISSING` in development). `AutoConfigProvider` is optional. Permissions use `config.canAccess`.
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# AutoSearch
|
|
2
|
+
|
|
3
|
+
**English** | [简体中文](i18n/zh-CN/auto-search.md) | [繁體中文](i18n/zh-TW/auto-search.md) | [日本語](i18n/ja/auto-search.md) | [한국어](i18n/ko/auto-search.md) | [Español](i18n/es/auto-search.md) | [Français](i18n/fr/auto-search.md) | [Deutsch](i18n/de/auto-search.md) | [Português (Brasil)](i18n/pt-BR/auto-search.md) | [Русский](i18n/ru/auto-search.md)
|
|
4
|
+
|
|
5
|
+
Search form. It renders an `AutoForm` and emits both a `QueryNode` and the raw values. Field rules, including throw behavior, are the [AutoForm](auto-form.md) rules.
|
|
6
|
+
|
|
7
|
+
`AutoSearchPanel` and `AutoSearchPanelProps` are deprecated aliases of `AutoSearch` and `AutoSearchProps`.
|
|
8
|
+
|
|
9
|
+
## Usage
|
|
10
|
+
|
|
11
|
+
```tsx
|
|
12
|
+
import { AutoSearch } from "@zeroman.yang/react-auto-components";
|
|
13
|
+
import "@zeroman.yang/react-auto-components/style.css";
|
|
14
|
+
|
|
15
|
+
<AutoSearch
|
|
16
|
+
fields={[
|
|
17
|
+
{ name: "name", label: "Name", match: "contains" },
|
|
18
|
+
{
|
|
19
|
+
name: "period",
|
|
20
|
+
type: "daterange",
|
|
21
|
+
label: "Period",
|
|
22
|
+
match: "between",
|
|
23
|
+
},
|
|
24
|
+
]}
|
|
25
|
+
onSearch={(query, values) => load(query, values)}
|
|
26
|
+
/>
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
`period` on the model must be a two-item tuple when `type` is `daterange` or `match` is `"between"`.
|
|
30
|
+
|
|
31
|
+
## Behavior and props
|
|
32
|
+
|
|
33
|
+
| Prop | Behavior |
|
|
34
|
+
| --- | --- |
|
|
35
|
+
| `fields` | Same `Field<T>` contract as AutoForm. `more: true` hides the field until "More" is expanded. Hidden fields are left out of the query. |
|
|
36
|
+
| `onSearch(query, values)` | Required. **Throw or reject: the inner form catches it, values stay, `error.message` is shown. Reset does not run.** |
|
|
37
|
+
| `onChange` | Fires for edits and for reset, before `onSearch` on an instant search. |
|
|
38
|
+
| `mode` | Default `"manual"`: search on the search button. `"instant"` also searches on every change. |
|
|
39
|
+
| `value`, `defaultValue` | Same controlled and reset rules as AutoForm. |
|
|
40
|
+
| `columns` | Default `3`. |
|
|
41
|
+
| `sortTags` | Buttons you own. `onRemove` is not caught. |
|
|
42
|
+
| Label props | Same as AutoForm. Passed layout wins over the provider. |
|
|
43
|
+
|
|
44
|
+
## Query values
|
|
45
|
+
|
|
46
|
+
| `match` | Value |
|
|
47
|
+
| --- | --- |
|
|
48
|
+
| omitted | `"eq"`, or `"in"` when the value is an array. |
|
|
49
|
+
| `"contains"` | Substring. `ignoreCase: true` folds case. |
|
|
50
|
+
| `"between"` | `[from, to]`. A scalar warns `RAC-FIELD-BETWEEN` and does not match rows. |
|
|
51
|
+
| `"isNull"` | Matches null or undefined. The entered value is ignored. |
|
|
52
|
+
| empty | `undefined`, `null`, `""`, and empty arrays are omitted, except `"isNull"`. |
|
|
53
|
+
|
|
54
|
+
`includeNull: true` OR-s an `isNull` condition. `searchFields` OR-s the same comparison across those row keys instead of `name`.
|
|
55
|
+
|
|
56
|
+
Reset restores `defaultValue` and then searches. `serializeRsql` throws `RAC-QUERY-FIELD` when a field name is not `/^[\w.]+$/`.
|
|
57
|
+
|
|
58
|
+
## Preconditions
|
|
59
|
+
|
|
60
|
+
Import `style.css` once (`RAC-CSS-MISSING` in development). `AutoConfigProvider` is optional and only supplies layout, translation, and access.
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
# AutoTable
|
|
2
|
+
|
|
3
|
+
**English** | [简体中文](i18n/zh-CN/auto-table.md) | [繁體中文](i18n/zh-TW/auto-table.md) | [日本語](i18n/ja/auto-table.md) | [한국어](i18n/ko/auto-table.md) | [Español](i18n/es/auto-table.md) | [Français](i18n/fr/auto-table.md) | [Deutsch](i18n/de/auto-table.md) | [Português (Brasil)](i18n/pt-BR/auto-table.md) | [Русский](i18n/ru/auto-table.md)
|
|
4
|
+
|
|
5
|
+
Table with local or remote rows, sort, filter, selection, optional virtualization, and CRUD dialogs. Search fields follow [AutoSearch](auto-search.md). Add and edit dialogs follow [AutoDialog](auto-dialog.md) and [AutoForm](auto-form.md).
|
|
6
|
+
|
|
7
|
+
Pass exactly one of `data`, `dataSource`, or `source`. Combining them is a type error.
|
|
8
|
+
|
|
9
|
+
## Usage
|
|
10
|
+
|
|
11
|
+
```tsx
|
|
12
|
+
import { AutoTable } from "@zeroman.yang/react-auto-components";
|
|
13
|
+
import { exportXlsx } from "@zeroman.yang/react-auto-components/xlsx";
|
|
14
|
+
import "@zeroman.yang/react-auto-components/style.css";
|
|
15
|
+
|
|
16
|
+
<AutoTable
|
|
17
|
+
id="orders"
|
|
18
|
+
rowKey="id"
|
|
19
|
+
data={rows}
|
|
20
|
+
columns={[{ key: "id", label: "Id" }]}
|
|
21
|
+
exportXlsx={exportXlsx}
|
|
22
|
+
/>
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
`exportXlsx` is imported from `@zeroman.yang/react-auto-components/xlsx`, not the main entry. `exceljs` is an optional dependency (`RAC-XLSX-DEP` if it is missing).
|
|
26
|
+
|
|
27
|
+
## JSON-driven table (zero function props)
|
|
28
|
+
|
|
29
|
+
Use this as the integration template for a JSON-producing service such as `zm_api`: the host registers executable behavior once; the table description contains only JSON. The endpoint below is an example host API, not a built-in library endpoint.
|
|
30
|
+
|
|
31
|
+
Save this description as `orders.table.json`:
|
|
32
|
+
|
|
33
|
+
```json
|
|
34
|
+
{
|
|
35
|
+
"id": "orders",
|
|
36
|
+
"rowKey": "id",
|
|
37
|
+
"source": "orders.list",
|
|
38
|
+
"pageSize": 10,
|
|
39
|
+
"columns": [
|
|
40
|
+
{ "key": "id", "label": "Id" },
|
|
41
|
+
{ "key": "customer", "label": "Customer" },
|
|
42
|
+
{ "key": "paid", "label": "Paid", "component": "paid-label" }
|
|
43
|
+
],
|
|
44
|
+
"searchFields": [
|
|
45
|
+
{ "name": "customer", "label": "Customer", "type": "input", "match": "contains" }
|
|
46
|
+
],
|
|
47
|
+
"rowActions": [
|
|
48
|
+
{ "id": "inspect", "label": "Inspect order", "action": "orders.inspect" }
|
|
49
|
+
]
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Register the keys in the React host, then pass the description unchanged:
|
|
54
|
+
|
|
55
|
+
```tsx
|
|
56
|
+
import {
|
|
57
|
+
AutoConfigProvider,
|
|
58
|
+
AutoTable,
|
|
59
|
+
type AutoServices,
|
|
60
|
+
type AutoTableProps,
|
|
61
|
+
} from "@zeroman.yang/react-auto-components";
|
|
62
|
+
import descriptionJson from "./orders.table.json";
|
|
63
|
+
import "@zeroman.yang/react-auto-components/style.css";
|
|
64
|
+
|
|
65
|
+
type Order = { id: string; customer: string; paid: boolean };
|
|
66
|
+
const description = descriptionJson as AutoTableProps<Order>;
|
|
67
|
+
|
|
68
|
+
const config = {
|
|
69
|
+
namespace: "orders-app",
|
|
70
|
+
sources: {
|
|
71
|
+
"orders.list": async (query, { signal }) => {
|
|
72
|
+
const response = await fetch("/api/orders/search", {
|
|
73
|
+
method: "POST",
|
|
74
|
+
headers: { "Content-Type": "application/json" },
|
|
75
|
+
body: JSON.stringify(query),
|
|
76
|
+
signal,
|
|
77
|
+
});
|
|
78
|
+
if (!response.ok) throw new Error(`Load orders failed: ${response.status}`);
|
|
79
|
+
return (await response.json()) as { rows: Order[]; total: number };
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
columns: {
|
|
83
|
+
"paid-label": { format: (value) => (value ? "Paid" : "Unpaid") },
|
|
84
|
+
},
|
|
85
|
+
rowActions: {
|
|
86
|
+
"orders.inspect": (row) => {
|
|
87
|
+
window.alert(`Order ${(row as Order).id}`);
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
} satisfies Partial<AutoServices>;
|
|
91
|
+
|
|
92
|
+
export default function OrdersPage() {
|
|
93
|
+
return (
|
|
94
|
+
<AutoConfigProvider config={config}>
|
|
95
|
+
<AutoTable<Order> {...description} />
|
|
96
|
+
</AutoConfigProvider>
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
The host endpoint receives `{ pageIndex, pageSize, sort, filter }` (`pageIndex` is zero-based; `filter` is the [query AST](auto-search.md)). It must apply filtering and sorting before paging and return, for example, `{ "rows": [{ "id": "o-1", "customer": "Ada", "paid": true }], "total": 1 }`. `total` is the full filtered count. Searching or paging calls the registered source again; a rejected request appears in the table with retry. Right-click a row to choose **Inspect order**.
|
|
102
|
+
|
|
103
|
+
All functions stay in `config`; no function is passed in the table description. `source`, column `component`, and row `action` name host registrations. Custom form/search widgets can likewise use `Field.component` with `config.fields`. These registries do not replace the built-in CRUD callbacks (`onAdd`, `onEdit`, `onDelete`); use registered row actions for custom workflows. Type assertions above describe the agreed data contract, not runtime validation: validate externally supplied descriptions and responses at the host boundary.
|
|
104
|
+
|
|
105
|
+
For isolated renders during AI/browser verification, see the [deterministic testing recipe](../llms.txt#deterministic-testing).
|
|
106
|
+
|
|
107
|
+
## Behavior and props
|
|
108
|
+
|
|
109
|
+
| Prop | Behavior |
|
|
110
|
+
| --- | --- |
|
|
111
|
+
| `id` | Required. Settings key is `${namespace}:table:${id}`. An empty id warns `RAC-TABLE-ID`. |
|
|
112
|
+
| `rowKey` | Field name or `(row) => string`. Must be unique on the loaded rows. Missing or duplicate ids warn `RAC-TABLE-ROWID`. Selection, expansion, and `scrollToRow` use it. |
|
|
113
|
+
| `data` | Local rows. Filtering and paging happen in the browser. |
|
|
114
|
+
| `dataSource(query, { signal })` | Remote page. **Reject: the message is shown with a retry button. Abort is ignored.** Return `{ rows, total }` where `total` is the full filtered count. |
|
|
115
|
+
| `columns` | Omit to use the first row's keys, skipping `_auto_*`. Column `type` formats values; it is not a form widget. |
|
|
116
|
+
| `pageSize` | Default `10`. `pagination` default `true`. |
|
|
117
|
+
| `height` | Default `440` pixels. `"auto"` fills a parent that already has a height. |
|
|
118
|
+
| `virtual` | Optional. Measures rows with TanStack Virtual. |
|
|
119
|
+
| `query`, `onQueryChange` | Controlled query. Omit to keep page, sort, and filter inside the table (sort and filter also follow saved presets). |
|
|
120
|
+
| `searchFields` | Renders `AutoSearch`. Its `onSearch` updates the table filter. |
|
|
121
|
+
| `formFields` | Schema for the add/edit dialog. If omitted, columns become text or integer fields. |
|
|
122
|
+
| `onAdd`, `onEdit`, `onDelete` | Called from the dialog after validation. **Reject or throw: the dialog stays open and shows `error.message`. Rows do not change unless your handler already changed them.** |
|
|
123
|
+
| `rowActions` | **`onClick` rejection is caught and shown in the status line for about 2.5s.** The row stays. `action` is a `config.rowActions` key used when `onClick` is omitted. Neither one warns `RAC-ROW-ACTION` and the status shows the message. |
|
|
124
|
+
| `component` on a column | Key in `config.columns` for `render`, `format`, `sort`, and `exportFormat`. A function on the column wins. An unknown key warns `RAC-COLUMN-COMPONENT` and the cell uses the default format. |
|
|
125
|
+
| `source` | Key in `config.sources`. Pass exactly one of `data`, `dataSource`, or `source`. An unknown key warns `RAC-TABLE-SOURCE` and the table shows that message with retry. |
|
|
126
|
+
| `exportXlsx` | Required only for xlsx. Missing adapter throws `RAC-TABLE-XLSX` and the status shows the translated adapter sentence. CSV and JSON are built in. |
|
|
127
|
+
| `versions` | Bump a layout, sort, filter, or export version to drop that saved preset. |
|
|
128
|
+
| `summaryValues` | Server totals for the filtered result, keyed by column. |
|
|
129
|
+
|
|
130
|
+
## Export and settings
|
|
131
|
+
|
|
132
|
+
`handle.export(format, scope)` resolves even when the status shows an error; the error is not rethrown. `scope` `"filtered"` on a remote table walks every page. An empty page before the last page throws `RAC-TABLE-EXPORT-PAGE` and does not download a partial file.
|
|
133
|
+
|
|
134
|
+
Saved layout, sort, filter, and export use `config.storage` (`localStorage` by default) and, when set, `config.settings`. A failed `settings.save` / `load` shows "Could not save settings" and a retry button. The in-memory table keeps working.
|
|
135
|
+
|
|
136
|
+
Invalid filter JSON in the settings dialog shows the translated "Invalid filter", warns `RAC-TABLE-FILTER`, and keeps the previous filter. `between` must be a two-item array. `in` must be an array.
|
|
137
|
+
|
|
138
|
+
`handle.reset()` clears sort, filter, selection, and puts the layout back on the column defaults. `handle.refresh()` re-runs `dataSource`. `handle.scrollToRow(id)` does nothing when that id is not loaded.
|
|
139
|
+
|
|
140
|
+
The table root is `data-testid="rac-table-{id}"`. Inside it: `rac-add`, `rac-delete-selected`, `rac-refresh`, `rac-settings`, `rac-export`, `rac-edit-{rowId}`, `rac-delete-{rowId}`. The ids do not follow the UI language. See [llms.txt](../llms.txt).
|
|
141
|
+
|
|
142
|
+
## Preconditions
|
|
143
|
+
|
|
144
|
+
Import `style.css` once. Set `AutoConfigProvider` `namespace` when more than one app on the same origin persists tables; the default namespace is `"auto"`. `AutoDialogProvider` is not required for the built-in add/edit dialogs; those use the declarative dialog. It is required only for `useAutoDialog()`.
|