@malloy-publisher/server 0.0.192 → 0.0.194

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.
Files changed (44) hide show
  1. package/build.ts +1 -0
  2. package/dist/app/api-doc.yaml +558 -1
  3. package/dist/app/assets/{HomePage-H1OH-VW5.js → HomePage-DbZS0N7G.js} +1 -1
  4. package/dist/app/assets/MainPage-CBuWkbmr.js +2 -0
  5. package/dist/app/assets/{ModelPage-Crau5hgZ.js → ModelPage-Bt37smot.js} +1 -1
  6. package/dist/app/assets/{PackagePage-CbubRhgE.js → PackagePage-DLZe50WG.js} +1 -1
  7. package/dist/app/assets/{ProjectPage-DUlJkYJ4.js → ProjectPage-FQTEPXP4.js} +1 -1
  8. package/dist/app/assets/{RouteError-DrNXNihc.js → RouteError-DefbDO7F.js} +1 -1
  9. package/dist/app/assets/{WorkbookPage-CBBv7n5U.js → WorkbookPage-CkAo16ar.js} +1 -1
  10. package/dist/app/assets/{core-Dzx75uJR.es-DwnFZnyO.js → core-BrfQApxh.es-DnvCX4oH.js} +14 -14
  11. package/dist/app/assets/index-5eLCcNmP.css +1 -0
  12. package/dist/app/assets/{index-d5rvmoZ7.js → index-Bu0ub036.js} +119 -119
  13. package/dist/app/assets/index-CkzK3JIl.js +40 -0
  14. package/dist/app/assets/index-CoA6HIGS.js +1742 -0
  15. package/dist/app/assets/{index.umd-CetYIBQY.js → index.umd-B6Ms2PpL.js} +46 -46
  16. package/dist/app/index.html +2 -2
  17. package/dist/server.mjs +1529 -985
  18. package/package.json +11 -10
  19. package/src/config.ts +7 -2
  20. package/src/controller/connection.controller.ts +102 -27
  21. package/src/dto/connection.dto.spec.ts +55 -0
  22. package/src/dto/connection.dto.ts +87 -2
  23. package/src/server.ts +201 -2
  24. package/src/service/connection.spec.ts +250 -4
  25. package/src/service/connection.ts +328 -473
  26. package/src/service/connection_config.spec.ts +123 -0
  27. package/src/service/connection_config.ts +562 -0
  28. package/src/service/connection_service.spec.ts +50 -0
  29. package/src/service/connection_service.ts +125 -32
  30. package/src/service/db_utils.spec.ts +161 -0
  31. package/src/service/db_utils.ts +131 -0
  32. package/src/service/materialization_service.spec.ts +18 -12
  33. package/src/service/materialization_service.ts +54 -7
  34. package/src/service/model.ts +24 -27
  35. package/src/service/package.spec.ts +125 -1
  36. package/src/service/package.ts +86 -44
  37. package/src/service/project.ts +172 -94
  38. package/src/service/project_store.spec.ts +72 -0
  39. package/src/service/project_store.ts +98 -81
  40. package/tests/unit/duckdb/attached_databases.test.ts +1 -19
  41. package/dist/app/assets/MainPage-GL06aMke.js +0 -2
  42. package/dist/app/assets/index-CMlGQMcl.css +0 -1
  43. package/dist/app/assets/index-CzjyS9cx.js +0 -1276
  44. package/dist/app/assets/index-HHdhLUpv.js +0 -676
@@ -117,6 +117,33 @@ export class ProjectStore {
117
117
  this.finishedInitialization = this.initialize();
118
118
  }
119
119
 
120
+ private async addConfiguredProject(project: ProcessedProject) {
121
+ try {
122
+ await this.addProject(
123
+ {
124
+ name: project.name,
125
+ resource: `${API_PREFIX}/projects/${project.name}`,
126
+ connections: project.connections,
127
+ packages: project.packages,
128
+ },
129
+ true,
130
+ );
131
+ } catch (error) {
132
+ this.logProjectInitializationError(project.name, error);
133
+ }
134
+ }
135
+
136
+ private logProjectInitializationError(
137
+ projectName: string | undefined,
138
+ error: unknown,
139
+ ) {
140
+ const label = projectName ? ` "${projectName}"` : "";
141
+ logger.error(
142
+ `Error initializing project${label}; skipping project`,
143
+ this.extractErrorDataFromError(error),
144
+ );
145
+ }
146
+
120
147
  private async initialize() {
121
148
  const reInit = process.env.INITIALIZE_STORAGE === "true";
122
149
  const initialTime = performance.now();
@@ -140,15 +167,7 @@ export class ProjectStore {
140
167
  // Load projects from config file
141
168
  await Promise.all(
142
169
  projectManifest.projects.map(async (project) => {
143
- await this.addProject(
144
- {
145
- name: project.name,
146
- resource: `${API_PREFIX}/projects/${project.name}`,
147
- connections: project.connections,
148
- packages: project.packages,
149
- },
150
- true,
151
- );
170
+ await this.addConfiguredProject(project);
152
171
  }),
153
172
  );
154
173
  } else {
@@ -159,88 +178,87 @@ export class ProjectStore {
159
178
  // Load projects from database
160
179
  await Promise.all(
161
180
  existingProjects.map(async (dbProject) => {
162
- // Check if project files exist on disk
163
- const projectExists = await fs.promises
164
- .access(dbProject.path)
165
- .then(() => true)
166
- .catch(() => false);
167
-
168
- if (!projectExists) {
169
- // Try to find in config and reload
170
- const projectConfig = projectManifest.projects.find(
171
- (p) => p.name === dbProject.name,
172
- );
173
-
174
- if (projectConfig) {
175
- const projectInstance = await this.addProject(
176
- {
177
- name: projectConfig.name,
178
- resource: `${API_PREFIX}/projects/${projectConfig.name}`,
179
- connections: projectConfig.connections,
180
- packages: projectConfig.packages,
181
- },
182
- true,
181
+ try {
182
+ // Check if project files exist on disk
183
+ const projectExists = await fs.promises
184
+ .access(dbProject.path)
185
+ .then(() => true)
186
+ .catch(() => false);
187
+
188
+ if (!projectExists) {
189
+ // Try to find in config and reload
190
+ const projectConfig = projectManifest.projects.find(
191
+ (p) => p.name === dbProject.name,
183
192
  );
184
193
 
185
- // Update database with new path
186
- await repository.updateProject(dbProject.id, {
187
- path: projectInstance.metadata.location,
188
- });
189
-
190
- return projectInstance.listPackages();
191
- } else {
192
- logger.error(
193
- `Project "${dbProject.name}" not found in config and files missing`,
194
- );
195
- return;
194
+ if (projectConfig) {
195
+ const projectInstance = await this.addProject(
196
+ {
197
+ name: projectConfig.name,
198
+ resource: `${API_PREFIX}/projects/${projectConfig.name}`,
199
+ connections: projectConfig.connections,
200
+ packages: projectConfig.packages,
201
+ },
202
+ true,
203
+ );
204
+
205
+ // Update database with new path
206
+ await repository.updateProject(dbProject.id, {
207
+ path: projectInstance.metadata.location,
208
+ });
209
+
210
+ return projectInstance.listPackages();
211
+ } else {
212
+ logger.error(
213
+ `Project "${dbProject.name}" not found in config and files missing`,
214
+ );
215
+ return;
216
+ }
196
217
  }
197
- }
198
218
 
199
- // Get connections from database
200
- const connections = await repository.listConnections(
201
- dbProject.id,
202
- );
203
-
204
- const projectInstance = await Project.create(
205
- dbProject.name,
206
- dbProject.path,
207
- connections.map((conn) => ({
208
- name: conn.name,
209
- type: conn.type,
210
- resource: `${API_PREFIX}/connections/${conn.name}`,
211
- ...conn.config,
212
- })),
213
- );
214
-
215
- this.projects.set(dbProject.name, projectInstance);
216
-
217
- // Get packages from database
218
- const packages = await repository.listPackages(
219
- dbProject.id,
220
- );
221
- packages.forEach((pkg) => {
222
- projectInstance.setPackageStatus(
223
- pkg.name,
224
- PackageStatus.SERVING,
219
+ // Get connections from database
220
+ const connections = await repository.listConnections(
221
+ dbProject.id,
222
+ );
223
+
224
+ const projectInstance = await Project.create(
225
+ dbProject.name,
226
+ dbProject.path,
227
+ connections.map((conn) => ({
228
+ name: conn.name,
229
+ type: conn.type,
230
+ resource: `${API_PREFIX}/connections/${conn.name}`,
231
+ ...conn.config,
232
+ })),
225
233
  );
226
- });
227
234
 
228
- return projectInstance.listPackages();
235
+ // Get packages from database
236
+ const packages = await repository.listPackages(
237
+ dbProject.id,
238
+ );
239
+ packages.forEach((pkg) => {
240
+ projectInstance.setPackageStatus(
241
+ pkg.name,
242
+ PackageStatus.SERVING,
243
+ );
244
+ });
245
+
246
+ this.projects.set(dbProject.name, projectInstance);
247
+
248
+ return projectInstance.listPackages();
249
+ } catch (error) {
250
+ this.logProjectInitializationError(
251
+ dbProject.name,
252
+ error,
253
+ );
254
+ }
229
255
  }),
230
256
  );
231
257
  } else {
232
258
  // Fallback to config file if database is empty
233
259
  await Promise.all(
234
260
  projectManifest.projects.map(async (project) => {
235
- await this.addProject(
236
- {
237
- name: project.name,
238
- resource: `${API_PREFIX}/projects/${project.name}`,
239
- connections: project.connections,
240
- packages: project.packages,
241
- },
242
- true,
243
- );
261
+ await this.addConfiguredProject(project);
244
262
  }),
245
263
  );
246
264
  }
@@ -256,7 +274,6 @@ export class ProjectStore {
256
274
  markNotReady();
257
275
  const errorData = this.extractErrorDataFromError(error);
258
276
  logger.error("Error initializing project store", errorData);
259
- process.exit(1);
260
277
  }
261
278
  }
262
279
 
@@ -856,7 +873,7 @@ export class ProjectStore {
856
873
  const projectPath = project.metadata?.location;
857
874
 
858
875
  // Close all connections before removing the project
859
- project.closeAllConnections();
876
+ await project.closeAllConnections();
860
877
 
861
878
  this.projects.delete(projectName);
862
879
  await this.deleteProjectFromDatabase(projectName);
@@ -838,7 +838,7 @@ describe("createProjectConnections - DuckDB", () => {
838
838
  await expect(
839
839
  createProjectConnections(connections, PROJECT_TEST_DIR),
840
840
  ).rejects.toThrow(
841
- "DuckDB attached databases names cannot conflict with connection name",
841
+ "DuckDB attached database names cannot conflict with connection name",
842
842
  );
843
843
  });
844
844
 
@@ -888,24 +888,6 @@ describe("createProjectConnections - DuckDB", () => {
888
888
  ).rejects.toThrow("DuckDB connection name cannot be 'duckdb'");
889
889
  });
890
890
 
891
- it("should throw when DuckDB connection has no attached databases", async () => {
892
- const connections: ApiConnection[] = [
893
- {
894
- name: "no_attached_db",
895
- type: "duckdb",
896
- duckdbConnection: {
897
- attachedDatabases: [],
898
- },
899
- },
900
- ];
901
-
902
- await expect(
903
- createProjectConnections(connections, PROJECT_TEST_DIR),
904
- ).rejects.toThrow(
905
- "DuckDB connection must have at least one attached database",
906
- );
907
- });
908
-
909
891
  it("should throw on unsupported connection type", async () => {
910
892
  const connections = [
911
893
  {
@@ -1,2 +0,0 @@
1
- import{u as V,g as F,r as g,R as _,a as X,b as S,c as M,e as A,j as t,s as m,f as w,h as v,k as I,P as Y,m as R,l as J,n as z,B as K,o as N,p as Z,T as U,q,t as oo,d as eo,v as b,C as j,w as ro,x as to,I as so,M as ao,y as $,S as no,z as lo,A as io,O as co}from"./index-d5rvmoZ7.js";function po(o,e,r,s,n){const[a,i]=g.useState(()=>n&&r?r(o).matches:s?s(o).matches:e);return X(()=>{if(!r)return;const p=r(o),u=()=>{i(p.matches)};return u(),p.addEventListener("change",u),()=>{p.removeEventListener("change",u)}},[o,r]),a}const uo={..._},L=uo.useSyncExternalStore;function go(o,e,r,s,n){const a=g.useCallback(()=>e,[e]),i=g.useMemo(()=>{if(n&&r)return()=>r(o).matches;if(s!==null){const{matches:c}=s(o);return()=>c}return a},[a,o,s,n,r]),[p,u]=g.useMemo(()=>{if(r===null)return[a,()=>()=>{}];const c=r(o);return[()=>c.matches,l=>(c.addEventListener("change",l),()=>{c.removeEventListener("change",l)})]},[a,r,o]);return L(u,p,i)}function O(o={}){const{themeId:e}=o;return function(s,n={}){let a=V();a&&e&&(a=a[e]||a);const i=typeof window<"u"&&typeof window.matchMedia<"u",{defaultMatches:p=!1,matchMedia:u=i?window.matchMedia:null,ssrMatchMedia:d=null,noSsr:c=!1}=F({name:"MuiUseMediaQuery",props:n,theme:a});let l=typeof s=="function"?s(a):s;return l=l.replace(/^@media( ?)/m,""),l.includes("print")&&console.warn(["MUI: You have provided a `print` query to the `useMediaQuery` hook.","Using the print media query to modify print styles can lead to unexpected results.","Consider using the `displayPrint` field in the `sx` prop instead.","More information about `displayPrint` on our docs: https://mui.com/system/display/#display-in-print."].join(`
2
- `)),(L!==void 0?go:po)(l,p,u,d,c)}}O();function xo(o){return S("MuiAppBar",o)}M("MuiAppBar",["root","positionFixed","positionAbsolute","positionSticky","positionStatic","positionRelative","colorDefault","colorPrimary","colorSecondary","colorInherit","colorTransparent","colorError","colorInfo","colorSuccess","colorWarning"]);const mo=o=>{const{color:e,position:r,classes:s}=o,n={root:["root",`color${v(e)}`,`position${v(r)}`]};return I(n,xo,s)},D=(o,e)=>o?`${o?.replace(")","")}, ${e})`:e,bo=m(Y,{name:"MuiAppBar",slot:"Root",overridesResolver:(o,e)=>{const{ownerState:r}=o;return[e.root,e[`position${v(r.position)}`],e[`color${v(r.color)}`]]}})(R(({theme:o})=>({display:"flex",flexDirection:"column",width:"100%",boxSizing:"border-box",flexShrink:0,variants:[{props:{position:"fixed"},style:{position:"fixed",zIndex:(o.vars||o).zIndex.appBar,top:0,left:"auto",right:0,"@media print":{position:"absolute"}}},{props:{position:"absolute"},style:{position:"absolute",zIndex:(o.vars||o).zIndex.appBar,top:0,left:"auto",right:0}},{props:{position:"sticky"},style:{position:"sticky",zIndex:(o.vars||o).zIndex.appBar,top:0,left:"auto",right:0}},{props:{position:"static"},style:{position:"static"}},{props:{position:"relative"},style:{position:"relative"}},{props:{color:"inherit"},style:{"--AppBar-color":"inherit"}},{props:{color:"default"},style:{"--AppBar-background":o.vars?o.vars.palette.AppBar.defaultBg:o.palette.grey[100],"--AppBar-color":o.vars?o.vars.palette.text.primary:o.palette.getContrastText(o.palette.grey[100]),...o.applyStyles("dark",{"--AppBar-background":o.vars?o.vars.palette.AppBar.defaultBg:o.palette.grey[900],"--AppBar-color":o.vars?o.vars.palette.text.primary:o.palette.getContrastText(o.palette.grey[900])})}},...Object.entries(o.palette).filter(J(["contrastText"])).map(([e])=>({props:{color:e},style:{"--AppBar-background":(o.vars??o).palette[e].main,"--AppBar-color":(o.vars??o).palette[e].contrastText}})),{props:e=>e.enableColorOnDark===!0&&!["inherit","transparent"].includes(e.color),style:{backgroundColor:"var(--AppBar-background)",color:"var(--AppBar-color)"}},{props:e=>e.enableColorOnDark===!1&&!["inherit","transparent"].includes(e.color),style:{backgroundColor:"var(--AppBar-background)",color:"var(--AppBar-color)",...o.applyStyles("dark",{backgroundColor:o.vars?D(o.vars.palette.AppBar.darkBg,"var(--AppBar-background)"):null,color:o.vars?D(o.vars.palette.AppBar.darkColor,"var(--AppBar-color)"):null})}},{props:{color:"transparent"},style:{"--AppBar-background":"transparent","--AppBar-color":"inherit",backgroundColor:"var(--AppBar-background)",color:"var(--AppBar-color)",...o.applyStyles("dark",{backgroundImage:"none"})}}]}))),fo=g.forwardRef(function(e,r){const s=A({props:e,name:"MuiAppBar"}),{className:n,color:a="primary",enableColorOnDark:i=!1,position:p="fixed",...u}=s,d={...s,color:a,position:p,enableColorOnDark:i},c=mo(d);return t.jsx(bo,{square:!0,component:"header",ownerState:d,elevation:4,className:w(c.root,n,p==="fixed"&&"mui-fixed"),ref:r,...u})}),ho=z(t.jsx("path",{d:"M6 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"})),yo=m(K,{name:"MuiBreadcrumbCollapsed"})(R(({theme:o})=>({display:"flex",marginLeft:`calc(${o.spacing(1)} * 0.5)`,marginRight:`calc(${o.spacing(1)} * 0.5)`,...o.palette.mode==="light"?{backgroundColor:o.palette.grey[100],color:o.palette.grey[700]}:{backgroundColor:o.palette.grey[700],color:o.palette.grey[100]},borderRadius:2,"&:hover, &:focus":{...o.palette.mode==="light"?{backgroundColor:o.palette.grey[200]}:{backgroundColor:o.palette.grey[600]}},"&:active":{boxShadow:o.shadows[0],...o.palette.mode==="light"?{backgroundColor:N(o.palette.grey[200],.12)}:{backgroundColor:N(o.palette.grey[600],.12)}}}))),vo=m(ho)({width:24,height:16});function Bo(o){const{slots:e={},slotProps:r={},...s}=o,n=o;return t.jsx("li",{children:t.jsx(yo,{focusRipple:!0,...s,ownerState:n,children:t.jsx(vo,{as:e.CollapsedIcon,ownerState:n,...r.collapsedIcon})})})}function ko(o){return S("MuiBreadcrumbs",o)}const Co=M("MuiBreadcrumbs",["root","ol","li","separator"]),jo=o=>{const{classes:e}=o;return I({root:["root"],li:["li"],ol:["ol"],separator:["separator"]},ko,e)},So=m(U,{name:"MuiBreadcrumbs",slot:"Root",overridesResolver:(o,e)=>[{[`& .${Co.li}`]:e.li},e.root]})({}),Mo=m("ol",{name:"MuiBreadcrumbs",slot:"Ol"})({display:"flex",flexWrap:"wrap",alignItems:"center",padding:0,margin:0,listStyle:"none"}),Ao=m("li",{name:"MuiBreadcrumbs",slot:"Separator"})({display:"flex",userSelect:"none",marginLeft:8,marginRight:8});function wo(o,e,r,s){return o.reduce((n,a,i)=>(i<o.length-1?n=n.concat(a,t.jsx(Ao,{"aria-hidden":!0,className:e,ownerState:s,children:r},`separator-${i}`)):n.push(a),n),[])}const Io=g.forwardRef(function(e,r){const s=A({props:e,name:"MuiBreadcrumbs"}),{children:n,className:a,component:i="nav",slots:p={},slotProps:u={},expandText:d="Show path",itemsAfterCollapse:c=1,itemsBeforeCollapse:l=1,maxItems:h=8,separator:B="/",...Q}=s,[T,W]=g.useState(!1),f={...s,component:i,expanded:T,expandText:d,itemsAfterCollapse:c,itemsBeforeCollapse:l,maxItems:h,separator:B},y=jo(f),H=Z({elementType:p.CollapsedIcon,externalSlotProps:u.collapsedIcon,ownerState:f}),P=g.useRef(null),G=x=>{const C=()=>{W(!0);const E=P.current.querySelector("a[href],button,[tabindex]");E&&E.focus()};return l+c>=x.length?x:[...x.slice(0,l),t.jsx(Bo,{"aria-label":d,slots:{CollapsedIcon:p.CollapsedIcon},slotProps:{collapsedIcon:H},onClick:C},"ellipsis"),...x.slice(x.length-c,x.length)]},k=g.Children.toArray(n).filter(x=>g.isValidElement(x)).map((x,C)=>t.jsx("li",{className:y.li,children:x},`child-${C}`));return t.jsx(So,{ref:r,component:i,color:"textSecondary",className:w(y.root,a),ownerState:f,...Q,children:t.jsx(Mo,{className:y.ol,ref:P,ownerState:f,children:wo(T||h&&k.length<=h?k:G(k),y.separator,B,f)})})});function Ro(o){return S("MuiToolbar",o)}M("MuiToolbar",["root","gutters","regular","dense"]);const zo=o=>{const{classes:e,disableGutters:r,variant:s}=o;return I({root:["root",!r&&"gutters",s]},Ro,e)},To=m("div",{name:"MuiToolbar",slot:"Root",overridesResolver:(o,e)=>{const{ownerState:r}=o;return[e.root,!r.disableGutters&&e.gutters,e[r.variant]]}})(R(({theme:o})=>({position:"relative",display:"flex",alignItems:"center",variants:[{props:({ownerState:e})=>!e.disableGutters,style:{paddingLeft:o.spacing(2),paddingRight:o.spacing(2),[o.breakpoints.up("sm")]:{paddingLeft:o.spacing(3),paddingRight:o.spacing(3)}}},{props:{variant:"dense"},style:{minHeight:48}},{props:{variant:"regular"},style:o.mixins.toolbar}]}))),Po=g.forwardRef(function(e,r){const s=A({props:e,name:"MuiToolbar"}),{className:n,component:a="div",disableGutters:i=!1,variant:p="regular",...u}=s,d={...s,component:a,disableGutters:i,variant:p},c=zo(d);return t.jsx(To,{as:a,className:w(c.root,n),ref:r,ownerState:d,...u})}),Eo=O({themeId:q}),No=z(t.jsx("path",{d:"M10 6 8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"})),$o=z(t.jsx("path",{d:"M3 18h18v-2H3zm0-5h18v-2H3zm0-7v2h18V6z"}));function Do(){const o=oo(),e=o["*"],r=eo();return t.jsx(b,{sx:{display:"flex",alignItems:"center"},children:t.jsxs(Io,{"aria-label":"breadcrumb",separator:t.jsx(No,{sx:{fontSize:14,color:"text.secondary"}}),sx:{"& .MuiBreadcrumbs-separator":{margin:"0 6px"}},children:[o.projectName&&t.jsx(j,{onClick:s=>r(`/${o.projectName}/`,s),label:o.projectName,size:"medium",sx:{backgroundColor:"white",color:"primary.main",fontWeight:500,height:"32px",fontSize:"1rem",cursor:"pointer","&:hover":{backgroundColor:"primary.100"}}}),o.packageName&&t.jsx(j,{onClick:s=>r(`/${o.projectName}/${o.packageName}/`,s),label:o.packageName,size:"medium",sx:{backgroundColor:"white",color:"primary.main",fontWeight:500,height:"32px",fontSize:"1rem",cursor:"pointer","&:hover":{backgroundColor:"secondary.100"}}}),e&&t.jsx(j,{onClick:s=>r(`/${o.projectName}/${o.packageName}/${e}`,s),label:e,size:"medium",sx:{backgroundColor:"white",color:"primary.main",fontWeight:500,height:"32px",fontSize:"1rem",cursor:"pointer","&:hover":{backgroundColor:"grey.200"}}})]})})}function Uo({logoHeader:o,endCap:e}){const r=ro(),s=to(),n=Eo(s.breakpoints.down("sm")),[a,i]=g.useState(null),p=!!a,u=l=>{i(l.currentTarget)},d=()=>i(null),c=[{label:"Malloy Docs",link:"https://docs.malloydata.dev/documentation/",sx:{color:"#14b3cb"}},{label:"Publisher Docs",link:"https://github.com/malloydata/publisher/blob/main/README.md",sx:{color:"#14b3cb"}},{label:"Publisher API",link:"/api-doc.html",sx:{color:"#14b3cb"}}];return t.jsxs(fo,{position:"sticky",elevation:0,sx:{backgroundColor:"background.paper",borderBottom:"1px solid",borderColor:"divider"},children:[t.jsxs(Po,{sx:{justifyContent:"space-between",flexWrap:"nowrap",minHeight:44},children:[o||t.jsxs(b,{sx:{display:"flex",alignItems:"center",gap:1,cursor:"pointer"},onClick:()=>r("/"),children:[t.jsx(b,{component:"img",src:"/logo.svg",alt:"Malloy",sx:{width:28,height:28}}),t.jsx(U,{variant:"h6",sx:{color:"text.primary",fontWeight:700,letterSpacing:"-0.025em",fontSize:{xs:"1.1rem",sm:"1.25rem"}},children:"Malloy Publisher"})]}),n?t.jsxs(t.Fragment,{children:[t.jsx(so,{color:"inherit",onClick:u,children:t.jsx($o,{})}),t.jsxs(ao,{anchorEl:a,open:p,onClose:d,anchorOrigin:{vertical:"bottom",horizontal:"right"},children:[c.map(l=>t.jsx($,{onClick:()=>{d(),window.location.href=l.link},sx:l.sx,children:l.label},l.label)),e&&t.jsx($,{children:e})]})]}):t.jsxs(no,{direction:"row",spacing:2,alignItems:"center",children:[c.map(l=>t.jsx(lo,{href:l.link,sx:l.sx,children:l.label},l.label)),e]})]}),t.jsx(b,{sx:{borderTop:"1px solid white",paddingLeft:"16px",paddingRight:"16px",marginBottom:"1px",overflowX:"auto"},children:t.jsx(Do,{})})]})}function Oo({headerProps:o}){return t.jsxs(b,{sx:{display:"flex",flexDirection:"column",minHeight:"100vh"},children:[t.jsx(Uo,{...o}),t.jsx(io,{maxWidth:"xl",component:"main",sx:{flex:1,display:"flex",flexDirection:"column",py:2,gap:2},children:t.jsx(b,{sx:{flex:1},children:t.jsx(co,{})})})]})}export{Oo as default};
@@ -1 +0,0 @@
1
- @layer priority1,priority2,priority3,priority4,priority5,priority6;@layer priority1{:root,.mly112oox9{--mly1v7zpod:0 1px 2px 0 rgba(0, 0, 0, .1), 0 2px 12px 0 rgba(0, 0, 0, .1);--mly1qokt1h:0px 2px 12px 0px rgba(0, 0, 0, .1), 0px 1px 2px 0px rgba(0, 0, 0, .1);--mly1f26pke:0 0 0 1px rgba(204, 211, 219, 1);--mly1yeb1wa:0 0 0 2px rgba(0, 100, 224, 1);--mly7zr30u:rgb(0, 100, 224);--mly1pim1be:rgba(1, 113, 227, .3) 0px 0px 0px 3px inset;--mlywpv3p0:rgba(0, 0, 0, .1)}:root,.mly182du4u{--mly231nev:rgba(10, 19, 23, 1);--mly1i3blw4:rgba(78, 96, 111, 1);--mly16ir2n5:rgba(164, 176, 188, 1);--mly883cce:rgba(0, 100, 224, 1);--mlyeem0lm:rgba(221, 226, 232, 1);--mlyy3jzoq:rgba(255, 255, 255, 1);--mly7qnfvx:rgba(10, 19, 23, 1);--mly3ib3qi:rgba(62, 6, 151, 1);--mlyndhcph:rgba(9, 68, 31, 1);--mlykotp7t:rgba(1, 73, 117, 1);--mlyf25c1a:rgba(66, 133, 244, 1)}:root,.mlyacbved{--mly8s4nhd:rgba(10, 19, 23, 1);--mly130oqjo:rgba(78, 96, 111, 1);--mlywh4rgx:rgba(164, 176, 188, 1);--mly1gq6bli:rgba(255, 255, 255, 1);--mly1jphivy:rgba(164, 176, 188, 1);--mly6i1qgk:rgba(121, 82, 255, 1);--mly1css67u:rgba(7, 109, 41, 1);--mly1fea1fg:rgba(2, 141, 193, 1);--mlyz9tc12:rgba(233, 175, 8, 1);--mly1dryxz7:rgba(0, 100, 224, 1);--mly176ansx:rgba(13, 134, 38, 1);--mlybq1dnb:rgba(227, 25, 59, 1)}:root,.mly16bcggl{--mlygaeq1b:rgba(255, 255, 255, 1);--mlyowxivf:rgba(255, 255, 255, 1);--mlyrhmj74:rgba(241, 244, 247, 1);--mlys9k3ya:rgba(230, 235, 239, 1);--mly1bn1nfc:rgba(37, 54, 63, 1);--mly1rtpqm4:rgba(10, 19, 23, .2);--mlywmj25p:rgba(121, 82, 255, .2);--mly1f95ebd:rgba(36, 187, 94, .2);--mly1jva6ta:rgba(3, 167, 215, .2);--mlyrbis2b:rgba(204, 211, 219, 1);--mly1bs2mf7:rgba(0, 130, 251, .2);--mlywj8cgu:rgba(11, 153, 31, .2);--mlyhsum04:rgba(226, 164, 0, .2);--mly19gk0g3:rgba(227, 25, 59, .2);--mlywfavfw:rgba(0, 0, 0, .05);--mlyenhe5r:rgba(0, 0, 0, .1);--mly1p0ff5j:rgba(255, 255, 255, .5);--mlyjz1sb4:rgba(230, 235, 239, 1);--mly1gkf9zs:rgba(221, 226, 232, 1);--mlyiun9k:rgba(204, 211, 219, 1);--mlyx17nfv:rgba(0, 100, 224, 1);--mly1tptikx:rgba(4, 87, 203, 1);--mly11oqegi:rgba(0, 76, 188, 1)}:root,.mly18uf1kx{--mlynfhokh:none}:root,.mly11fl7i8{--mlyvpnzvp:none}.mly4f1hfu,.mly4f1hfu:root{--mly1bs2mf7:rgba(0, 130, 251, .24);--mlygaeq1b:rgba(20, 22, 25, 1);--mly11oqegi:rgba(74, 126, 205, 1);--mlyx17nfv:rgba(98, 162, 255, 1);--mly1tptikx:rgba(88, 146, 232, 1);--mlyiun9k:rgba(64, 71, 78, 1);--mlyjz1sb4:rgba(48, 53, 58, 1);--mly1gkf9zs:rgba(55, 61, 67, 1);--mly1jva6ta:rgba(3, 167, 215, .24);--mly1p0ff5j:rgba(0, 0, 0, .25);--mlyrbis2b:rgba(71, 76, 82, 1);--mly1rtpqm4:rgba(245, 247, 250, .16);--mly1f95ebd:rgba(36, 187, 94, .24);--mly19gk0g3:rgba(227, 25, 59, .24);--mlyenhe5r:rgba(255, 255, 255, .12);--mlywfavfw:rgba(255, 255, 255, .06);--mlywj8cgu:rgba(11, 153, 31, .24);--mlywmj25p:rgba(121, 82, 255, .24);--mlyowxivf:rgba(30, 33, 37, 1);--mlyrhmj74:rgba(39, 43, 47, 1);--mlys9k3ya:rgba(48, 53, 58, 1);--mly1bn1nfc:rgba(245, 247, 250, 1);--mlyhsum04:rgba(226, 164, 0, .24)}.mly1gnh9hh,.mly1gnh9hh:root{--mly1dryxz7:rgba(98, 162, 255, 1);--mly1fea1fg:rgba(108, 208, 244, 1);--mlywh4rgx:rgba(126, 139, 151, 1);--mly1jphivy:rgba(126, 139, 151, 1);--mly1css67u:rgba(118, 231, 166, 1);--mlybq1dnb:rgba(255, 122, 147, 1);--mly176ansx:rgba(118, 231, 166, 1);--mly8s4nhd:rgba(241, 244, 247, 1);--mly1gq6bli:rgba(5, 5, 5, 1);--mly6i1qgk:rgba(180, 139, 255, 1);--mly130oqjo:rgba(189, 198, 206, 1);--mlyz9tc12:rgba(233, 175, 8, 1)}.mlyfg9r64,.mlyfg9r64:root{--mly1v7zpod:0 1px 2px 0 rgba(0, 0, 0, .6), 0 2px 12px 0 rgba(0, 0, 0, .4);--mly1qokt1h:0px 2px 12px 0px rgba(0, 0, 0, .5), 0px 1px 2px 0px rgba(0, 0, 0, .4);--mly1yeb1wa:0 0 0 2px rgba(98, 162, 255, 1);--mly7zr30u:rgb(98, 162, 255);--mly1pim1be:rgba(98, 162, 255, .3) 0px 0px 0px 3px inset;--mly1f26pke:0 0 0 1px rgba(71, 76, 82, 1);--mlywpv3p0:rgba(255, 255, 255, .15)}.mly74xrg6,.mly74xrg6:root{--mlykotp7t:rgba(108, 208, 244, 1);--mlyf25c1a:rgba(144, 187, 255, 1);--mly16ir2n5:rgba(126, 139, 151, 1);--mly7qnfvx:rgba(221, 226, 232, 1);--mlyndhcph:rgba(118, 231, 166, 1);--mly883cce:rgba(98, 162, 255, 1);--mly231nev:rgba(241, 244, 247, 1);--mlyy3jzoq:rgba(5, 5, 5, 1);--mly3ib3qi:rgba(180, 139, 255, 1);--mly1i3blw4:rgba(189, 198, 206, 1);--mlyeem0lm:rgba(30, 33, 37, 1)}.mly10cf5cp{--mly10mhzaa:var(--mly1f95ebd)}.mlykvi9ht{--mly10mhzaa:var(--mly1jva6ta)}.mly1rve117{--mly10mhzaa:var(--mly1rtpqm4)}.mlyihc5ie{--mly10mhzaa:var(--mlywmj25p)}.mly8bgh0r{--mly13n7235:var(--mly231nev)}.mly1r5zvhd{--mly13n7235:var(--mly3ib3qi)}.mlys5r2en{--mly13n7235:var(--mlykotp7t)}.mly1u6t2w6{--mly13n7235:var(--mlyndhcph)}.mlynu5hmx{--mly1by112x:0}.mly15rdse5{--mly1hmjrsb:var(--mly8s4nhd)}.mly5xbp4t{--mly1hpdckv:var(--mly231nev)}.mly3mt86g{--mly1hpdckv:var(--mlyy3jzoq)}.mly5deeek{--mly1ltarg1:var(--mly231nev)}.mlybcavtu{--mly1ojyoay:var(--mly231nev)}.mlywis56f{--mly1ojyoay:var(--mly3ib3qi)}.mly1eg6ybj{--mly1ojyoay:var(--mlykotp7t)}.mlyy280wj{--mly1ojyoay:var(--mlyndhcph)}.mly7ouyw2{--mly5m5edj:var(--mly1i3blw4)}.mlym9y5t7{--mlynfhokh:block}.mly1bo1i26{--mlyri8z08:0}.mly1ae5hkt{--mlyvpnzvp:block}.mly11ogjb6{--mlyvpnzvp:none}.mlyf8wvcd{--mlyvygx4q:var(--mly1css67u)}.mlyrtwgpv{--mlyvygx4q:var(--mly1fea1fg)}.mly1f8soc4{--mlyvygx4q:var(--mly6i1qgk)}.mly1izbou4{--mlyvygx4q:var(--mly8s4nhd)}.mly1n5rdk7{--mlyxo3nik:var(--mly1gq6bli)}.mlypfd894{--mlyxo3nik:var(--mly8s4nhd)}@keyframes mlyqng64z-B{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.mly1z060rf:is([data-disabled]){--mly1hmjrsb:var(--mlywh4rgx)}.mly1jacekv:is([data-disabled]){--mly1ltarg1:var(--mly16ir2n5)}.mly7h4d18:is([data-disabled]){--mly5m5edj:var(--mly16ir2n5)}.mly1iu3zmn:disabled{--mly1hpdckv:var(--mly1i3blw4)}.mly13vk70h:disabled{--mly1hpdckv:var(--mlyy3jzoq)}.mly1dsjhx:disabled{--mlyxo3nik:var(--mly1gq6bli)}.mlyiv1q3g:disabled{--mlyxo3nik:var(--mlywh4rgx)}.mly1u5txqc:hover{--mly1by112x:.3}.mly1fzkygm:hover{--mlyri8z08:.3}.mly1g9of4s:hover{--mlyvpnzvp:block}.mly157rht3:hover{--mlyvpnzvp:inline-flex}}@layer priority2{.mly5uxqc1{background:#0000}.mly1lrzu1o{background:transparent!important}.mly1md70p1{background:transparent}.mlysu8s4a{background:var(--mly10mhzaa)}.mly1wp621z{background:var(--mly1bs2mf7)}.mly1dyadpi{background:var(--mly1p0ff5j)}.mly1d8y1cu{background:var(--mly1rtpqm4)}.mlycuvecc{background:var(--mlygaeq1b)}.mly7cs2c{background:var(--mlyiun9k)}.mly2taacv{background:var(--mlyjz1sb4)}.mly1bjczhr{background:var(--mlyowxivf)}.mly1cn1p8l{background:var(--mlyrbis2b)}.mly1cmjei3{background:var(--mlys9k3ya)}.mly1kyiqbu{background:var(--mlyx17nfv)}.mly2yh2zd{border:1px solid #e0e0e0}.mly8fuzfi{border:1px solid #efefef}.mly1dc9p4k{border:1px solid red}.mly27xtdb{border:1px solid rgb(239,239,239)}.mlyfj9a5l{border:1px solid transparent}.mly1vspu6z{border:1px solid var(--malloy-composer-form-background,#efefef)}.mlyss3vti{border:1px solid var(--malloy-composer-form-border,#ececed)}.mlyv3vvaf{border:1px solid var(--malloy-composer-form-focus,#4285f4)}.mlyhu5y25{border:1px solid var(--mlyrbis2b)}.mly1gs6z28{border:none}.mly15r89dc{grid-area:1 / 1}.mly1ghz6dp{margin:0}.mlys8nxjv{margin:4px 12px 0}.mlynfbntj{margin:5px 0}.mly16zck5j{margin:5px}.mlykib98w{margin:8px}.mly1bpp3o7{margin:auto}.mlywp4ipm{padding:0 24px 24px}.mlyehqz9p{padding:0 4px}.mly1l4tkcb{padding:0 8px 8px}.mly1717udv{padding:0}.mly1b4vry6{padding:10px 0}.mly7z7khe{padding:10px}.mlyc7ga6q{padding:12px}.mly1tamke2{padding:16px}.mly1e41zw8{padding:1px 5px}.mlyfvt8nb{padding:2px 12px 2px 6px}.mlybsehbd{padding:2px 3px}.mlyxzb6uj{padding:2px 4px}.mly195ery5{padding:3.75px 7px}.mly1gqu590{padding:3px 10px}.mly34lxi1{padding:3px 3px 3px 10px}.mly92jh8x{padding:4px 0 8px}.mlyztvwtv{padding:4px 0}.mly1fut7tt{padding:4px 12px 12px}.mlytdwleo{padding:4px 12px}.mly9cpjcd,.mlydqdrvq{padding:4px 8px}.mlyfawy5m{padding:4px}.mly17qkr04{padding:5px 0}.mly36usyh{padding:5px 10px}.mly14odnwx{padding:5px}.mly153ncpu{padding:8px 12px}.mlye8ttls{padding:8px}.mly1tx4nyv:is([data-state=checked]){background:var(--mly1bs2mf7)}.mly1vg538p:is([data-highlighted]){background:var(--mlywfavfw)}.mly1julgsk:is([data-highlighted]):is([data-state=checked]){background:var(--mly1bs2mf7)}.mly1b1kpiu:hover{background:var(--mly1gkf9zs)}.mly1cbp0pj:hover{background:var(--mly1tptikx)}.mly1xbhkwo:hover{background:var(--mlywfavfw)}.mly111eqgs:active{background:var(--mly11oqegi)}.mly1v24qdc:active{background:var(--mlyenhe5r)}.mlybc727s:active{background:var(--mlyiun9k)}}@layer priority3{.mly1akygb0{border-color:none}.mly10bk7bj{border-color:var(--malloy-composer-focus,#c3d7f7)}.mlyv66to0{border-color:var(--mly7zr30u)}.mly17v018m{border-color:var(--mlyrbis2b)}.mly11zuszs{border-radius:0 0 10px 10px}.mly19ctu66{border-radius:0 4px 4px 0}.mlyq516e8{border-radius:10px 10px 0 0}.mly1q4ynmn{border-radius:10px}.mly4pepcl{border-radius:12px}.mly18zih8k{border-radius:3px}.mlytah5vv{border-radius:4px 0 0 4px}.mly12oqio5{border-radius:4px}.mly1f96onm{border-radius:50px}.mly1sxf85j{border-radius:5px}.mly1kogg8i{border-radius:6px}.mlyur7f20{border-radius:8px}.mly10hpsqq{border-radius:9999px}.mly1pjcqnp{border-radius:inherit}.mly1ruvecq{border-right:1px solid var(--mlyrbis2b)}.mlyng3xce{border-style:none}.mly1y0btm7{border-style:solid}.mlye536se{border-top:1px solid #e0e0e0}.mly77krkw{border-top:1px solid var(--malloy-composer-form-border,#ececec)}.mlyc342km{border-width:0}.mlymkeg23{border-width:1px}.mly3psx0u{flex:0 0 auto}.mly98rzlu{flex:1}.mly883omv{gap:10px}.mlyou54vl{gap:16px}.mly12mrbbr{gap:1px}.mly1665zp3{gap:24px}.mly195vfkc{gap:2px}.mly1ed6fcf{gap:3px}.mly1jnr06f{gap:4px}.mly1nejdyq{gap:5px}.mly167g77z{gap:8px}.mly623te4{grid-column:span 2}.mly1a80n4u{grid-column:span 3}.mlye8uvvx{list-style:none}.mly1a2a7pz{outline:none}.mlyysyzu8{overflow:auto}.mlyb3r6kr{overflow:hidden}.mly1rea2x4{overflow:visible}.mly1ku5rj1{place-items:center}.mly1hl2dhg{text-decoration:none}.mly14znju7{transition:opacity .5s ease}.mly1fxp9ov:hover{border-color:var(--malloy-composer-focus,#c3d7f7)}.mlyetl2wx:focus{border-color:#4285f4}}@layer priority4{.mly1ua5tub{-webkit-box-orient:vertical}.mly1gzmk7r{-webkit-line-clamp:3}.mlyc26acl{align-content:center}.mly6s0dn4{align-items:center}.mlypqajaz{align-items:end}.mly1cy8zhl{align-items:flex-start}.mly7a106z{align-items:start}.mly1071x5a{align-items:top}.mly1c74tu6{animation-duration:2s}.mlya4qsjk{animation-iteration-count:infinite}.mly8jsasv{animation-name:mlyqng64z-B}.mly1esw782{animation-timing-function:linear}.mly1vzefiq{background-color:#f0f6ff}.mlyjbqb8w{background-color:transparent}.mly1jjku57{background-color:var(--malloy-composer-form-disabledBackground,#f6f6f6)}.mly6wxqrg{background-color:var(--malloy-composer-form-focusBackground,#f0f6ff)}.mlyrkwa2d{background-color:var(--mly19gk0g3)}.mly1pcjto7{background-color:var(--mly1bn1nfc)}.mly1pnbjq1{background-color:var(--mly1bs2mf7)}.mlyn8dcc1{background-color:var(--mlygaeq1b)}.mly1x7w6om{background-color:var(--mlyhsum04)}.mly1yduej5{background-color:var(--mlyowxivf)}.mly13z5u0c{background-color:var(--mlyrhmj74)}.mlyzh2ni8{background-color:var(--mlys9k3ya)}.mly1x3oq6j{background-color:var(--mlywj8cgu)}.mly12peec7{background-color:#fff}.mly7dvq3r{border-buttom-color:var(--mlyrbis2b)}.mly1mwwwfo{border-collapse:collapse}.mlyzteli5{border-right-background:var(--mlyrbis2b)}html:not([dir=rtl]) .mlydid9jw{box-shadow:0 0 0 1px var(--mly7zr30u) inset,var(--mly1pim1be)}html[dir=rtl] .mlydid9jw{box-shadow:0 0 0 1px var(--mly7zr30u) inset,var(--mly1pim1be)}html:not([dir=rtl]) .mly1kmqopl{box-shadow:0 0 5px #0000001a,0 0 1px #0000001a}html[dir=rtl] .mly1kmqopl{box-shadow:0 0 5px #0000001a,0 0 1px #0000001a}html:not([dir=rtl]) .mly5n1uv4{box-shadow:0 1px 2px #0000001a,0 2px 12px #0000001a}html[dir=rtl] .mly5n1uv4{box-shadow:0 1px 2px #0000001a,0 2px 12px #0000001a}.mly1a3rnpv{box-shadow:0 1px 5px 1px #0000001a}html:not([dir=rtl]) .mly17fq3gk{box-shadow:0 2px 12px #0000001a,0 1px 2px #0000001a}html[dir=rtl] .mly17fq3gk{box-shadow:0 2px 12px #0000001a,0 1px 2px #0000001a}.mly1gnnqk1{box-shadow:none}.mly1ga53z4{box-shadow:var(--mly1f26pke)}.mly118a1h2{box-shadow:var(--mly1pim1be)}.mly8dadwf{box-shadow:var(--mly1qokt1h)}.mly1towwp7{box-shadow:var(--mly1v7zpod)}.mly1p9pjdr{box-shadow:var(--mly1yeb1wa)}.mly9f619{box-sizing:border-box}.mly1v5ugh9{color:#505050}.mly358b0h{color:#909090}.mly1e2nbdu{color:red}.mlyizdh9v{color:#5f6368}.mly183j0n7{color:#e4e6eb}.mly19co3pv{color:transparent}.mly1pc1dlx{color:var(--malloy-composer-form-foreground,#5f6368)}.mly1r0d382{color:var(--mly130oqjo)}.mly1xre2ib{color:var(--mly13n7235)}.mlywzxoxx{color:var(--mly16ir2n5)}.mly1l99qkd{color:var(--mly176ansx)}.mly1evcnq1{color:var(--mly1css67u)}.mly1tw9ct1{color:var(--mly1dryxz7)}.mly1h091fy{color:var(--mly1fea1fg)}.mly1kiansi{color:var(--mly1gq6bli)}.mly1mguc6l{color:var(--mly1hmjrsb)}.mlyaerthn{color:var(--mly1hpdckv)}.mly9dwj6z{color:var(--mly1i3blw4)}.mlyann5r3{color:var(--mly1jphivy)}.mly12lmysb{color:var(--mly1ltarg1)}.mly1ard1hs{color:var(--mly1ojyoay)}.mly1ue28sr{color:var(--mly231nev)}.mlyydnxy5{color:var(--mly3ib3qi)}.mly15jt5ur{color:var(--mly5m5edj)}.mly1ywypuw{color:var(--mly6i1qgk)}.mly17rwmdj{color:var(--mly883cce)}.mly1p68tcb{color:var(--mly8s4nhd)}.mly109d434{color:var(--mlybq1dnb)}.mlya26k3e{color:var(--mlyeem0lm)}.mly1nwq7qm{color:var(--mlyf25c1a)}.mlywn9h7t{color:var(--mlyvygx4q)}.mly16un6j3{color:var(--mlywh4rgx)}.mlyuk6yi3{color:var(--mlyxo3nik)}.mly7neac5{color:var(--mlyz9tc12)}.mlyt0e3qv{cursor:default}.mly7eptgl{cursor:ew-resize}.mly1ipiool{cursor:initial}.mly1ypdohk{cursor:pointer}.mly104kibb{display:-webkit-box}.mly78zum5{display:flex}.mlyrvj5dj{display:grid}.mly1rg5ohu{display:inline-block}.mly3nfvp2{display:inline-flex}.mlywz0xwf{display:inline-grid}.mly1s85apg{display:none}.mly1vsucm1{display:var(--mlynfhokh)}.mly2b4tyj{display:var(--mlyvpnzvp)}.mlydt5ytf{flex-direction:column}.mly1q0g3np{flex-direction:row}.mly1c4vz4f{flex-grow:0}.mly1iyjqo2{flex-grow:1}.mly2lah0s{flex-shrink:0}.mly1a02dak{flex-wrap:wrap}.mly6icuqf{font-family:sans-serif}.mly1rj5sg5{font-family:SF Pro Text,-apple-system,system-ui,sans-serif}.mly12xrqmb{font-family:var(--malloy-composer-fontFamily,sans-serif)}.mlyfifm61{font-size:12px}.mlyif65rj{font-size:14px}.mly1j61zf2{font-size:16px}.mlymhiqyu{font-size:var(--malloy-composer-fontSize,14px)}.mly64z8l9{font-size:var(--malloy-composer-menu-fontSize,14px)}.mly1j61x8r{font-style:normal}.mlyo1l8bm{font-weight:400}.mly1s688f{font-weight:600}.mly1xlr1w8,.mly117nqv4{font-weight:700}.mly1fcty0u{font-weight:400}.mly1mt1orb{grid-auto-flow:column}.mlysd5ean{grid-auto-rows:max-content}.mly15396mt{grid-template-columns:100px auto 100px}.mly52fmzj{grid-template-columns:1fr auto}.mly1g3yg12{grid-template-columns:auto 1fr auto}.mlybyjr8{grid-template-columns:auto}.mly16kridx{grid-template-columns:min-content 1fr min-content}.mlyl56j7k{justify-content:center}.mly13a6bvl{justify-content:flex-end}.mly1nhvcw1{justify-content:flex-start}.mly1rfj78v{justify-content:left}.mly1lvf691{justify-content:right}.mly1l1ennw{justify-content:space-around}.mly1qughib{justify-content:space-between}.mlylqzeqv{justify-content:start}.mly11e9jwx{leading-trim:both}.mly1gu5id8{letter-spacing:-.24px}.mly12oo3zp{letter-spacing:0}.mly1d3mw78{line-height:16px}.mly1rl49lg{line-height:2.2em}.mly1fc57z9{line-height:20px}.mly1o2sk6j{line-height:24px}.mly1vqud6w{opacity:70%}.mly1d3ksz1{opacity:var(--mly1by112x)}.mly15sj6ns{opacity:var(--mlyri8z08)}.mly47corl{pointer-events:none}.mly10l6tqk{position:absolute}.mlyixxii4{position:fixed}.mly1n2onr6{position:relative}.mly7wzq59{position:sticky}.mly2b8uid{text-align:center}.mlydpxx8g{text-align:left}.mly1vqy1sf{text-edge:cap}.mlylyipyv{text-overflow:ellipsis}.mly6mezaz{text-transform:none}.mly87ps6o{user-select:none}.mlyxymvpz{vertical-align:middle}.mly1n8ftqi{vertical-align:text-top}.mly16dsc37{vertical-align:top}.mlylshs6z{visibility:hidden}.mlynpuxes{visibility:visible}.mlyuxw1ft{white-space:nowrap}.mly126k92a{white-space:pre-wrap}.mly1so62im{will-change:transform}.mly1vvkbs{word-wrap:break-word}.mly35i7{writing-mode:sideways-lr}.mly1ja2u2z{z-index:0}.mly1vjfegm{z-index:1}.mly11uqc5h{z-index:100}.mlyhtitgo{z-index:2}.mly14vaotu:is([data-state=active]){background-color:var(--mly1bs2mf7)}.mly14kfzap:is([data-disabled]){color:var(--mly16ir2n5)}.mlyb0tsu4:is([data-state=active]){color:var(--mly883cce)}.mly5ezrf1:is([data-disabled]){cursor:not-allowed}.mly1uifvsu:is([data-state=active]){font-weight:700}.mly1s07b3s:disabled{cursor:not-allowed}.mly1haqvef:hover{background-color:#dde2e8}.mlyjg9ulk:hover{background-color:#efefef}.mlyt89l8w:hover{background-color:var(--malloy-composer-form-focusBackground,#f0f6ff)}.mly1vtmp6m:hover{background-color:var(--mlyrhmj74)}.mlyk1e6ed:hover{box-shadow:#ccd3db4d 0 0 0 3px inset}.mlytw1abo:focus{background-color:#fff}}@layer priority5{.mlybmeysy{border-bottom-color:var(--mlyrbis2b)}.mly1q0q8m5{border-bottom-style:solid}.mlyso031l{border-bottom-width:1px}.mlyv3cp8q{border-right-color:var(--mlyrbis2b)}.mly32b0ac{border-right-style:solid}.mlys1s249{border-right-width:1px}.mlydwjgp9{border-top-color:var(--mlyrbis2b)}.mly13fuv20{border-top-style:solid}.mly178xt8z{border-top-width:1px}.mly1ey2m1c{bottom:0}.mlyqtp20y{height:0}.mly5yr21d{height:100%}.mlypyat2d{height:100px}.mlyn866dk{height:136px}.mly1v9usgg{height:14px}.mlywrnneb{height:16.5px}.mlylup9mm{height:16px}.mlymix8c7{height:18px}.mlyjm9jq1{height:1px}.mly1m3v4wt{height:200px}.mlyk2yuxw{height:209.5px}.mly1qx5ct2{height:20px}.mlyxk0z11{height:24px}.mlyd7y6wv{height:26px}.mly1fgtraw{height:28px}.mlyc9qbxq{height:36px}.mlyng8ra{height:60px}.mlydk7pt{height:8px}.mlylo07zb{height:90px}.mlyt7dq6l{height:auto}.mly10msahz{height:calc(100% - 4px)}.mly1ktj5wk{height:calc(100% - 8px)}.mlyu96u03{left:0}.mly12nagc{margin-bottom:4px}.mlyu06os2{margin-bottom:5px}.mly1e56ztr{margin-bottom:8px}.mlyj3b58b{margin-left:0}.mly1tpqehw{margin-left:12px}.mlyq1n1xh{margin-left:16px}.mly1iog12x{margin-left:4px}.mlyet2fuk{margin-left:8px}.mly1yf7rl7{margin-right:0}.mly1xmf6yo{margin-top:8px}.mly1rvw3h8{max-height:136px}.mly1hkcv85{max-height:200px}.mly1xyq3li{max-height:20em}.mlyq3t0pi{max-height:280px}.mlyuyqlj2{max-height:300px}.mly1phlbz0{max-height:400px}.mly1jcbksy{max-height:420px}.mly3d5gib{max-height:50vh}.mly1l4ul0t{max-height:75vh}.mly1kbvuzt{max-height:var(--radix-tooltip-content-available-height)}.mlyqyhut4{max-width:16.5px}.mly1pdpmub{max-width:264px}.mly1jkqq1h{max-width:280px}.mly1dc814f{max-width:350px}.mlyxc7z9f{max-width:360px}.mly1j9u4d2{max-width:400px}.mly1lr1uin{max-width:420px}.mlymcgfsh{max-width:60px}.mly14zcgw3{max-width:75vw}.mly2lwn1j{min-height:0}.mly4x6u8j{min-width:16.5px}.mlygc0pbm{min-width:1px}.mlyt4ypqs{min-width:20px}.mlyytlacd{min-width:224px}.mlylm99nl{min-width:240px}.mly2ixbly{min-width:250px}.mlyfvyar9{min-width:60px}.mly1onzeue{min-width:95px}.mly1odjw0f{overflow-y:auto}.mly18d9i69{padding-bottom:0}.mly1l90r2v{padding-bottom:16px}.mlyjkvuk6{padding-bottom:4px}.mlywib8y2{padding-bottom:8px}.mlynm25rq{padding-left:16px}.mly6wrskw{padding-left:4px}.mly163pfp{padding-left:8px}.mlymzs88n{padding-right:4px}.mlyy13l1i{padding-right:8px}.mly1nn3v0j{padding-top:2px}.mly1iorvi4{padding-top:4px}.mly123j3cw{padding-top:5px}.mly1y1aw1k{padding-top:8px}.mly1bkpikb{right:-2px}.mly3m8u43{right:0}.mly13vifvy{top:0}.mlynalus7{width:0}.mlyh8yej3{width:100%}.mlynrytzq{width:10em}.mly6jxa94{width:14px}.mly18kybhu{width:15em}.mlyjxf2f8{width:16.5px}.mly1kky2od{width:16px}.mly1xp8n7a{width:18px}.mly1i1rx1s{width:1px}.mlyw4jnvo{width:20px}.mlyvy4d1p{width:24px}.mly1f1nlb9{width:25%}.mlyqyf9gi{width:250px}.mly1hfn5x7{width:260px}.mlygd8bvy{width:28px}.mlybl57os{width:323px}.mlyxsgkw5{width:350px}.mly869kya{width:5.5em}.mly1ftt334{width:5px}.mly14rvwrp{width:600px}.mly1247r65{width:60px}.mly1xc55vz{width:8px}.mlym6i5cn{width:90%}.mly10lvyaf{width:calc(100% - 12px)}.mly1rxuhir{width:calc(100% - 22px)}.mly112rgfc{width:calc(100% - 40)}.mly1g65f5b{width:var(--radix-tooltip-trigger-width)}}@layer priority6{.mlyf2qczu::placeholder{color:var(--mly1i3blw4)}}.w-md-editor-bar{position:absolute;cursor:s-resize;right:0;bottom:0;margin-top:-11px;margin-right:0;width:14px;z-index:3;height:10px;border-radius:0 0 3px;-webkit-user-select:none;user-select:none}.w-md-editor-bar svg{display:block;margin:0 auto}.w-md-editor-area{overflow:auto;border-radius:5px}.w-md-editor-text{min-height:100%;position:relative;text-align:left;white-space:pre-wrap;word-break:keep-all;overflow-wrap:break-word;box-sizing:border-box;padding:10px;margin:0;font-size:14px!important;line-height:18px!important;font-variant-ligatures:common-ligatures}.w-md-editor-text-pre,.w-md-editor-text-input,.w-md-editor-text>.w-md-editor-text-pre{margin:0;border:0;background:none;box-sizing:inherit;display:inherit;font-family:inherit;font-family:var(--md-editor-font-family)!important;font-size:inherit;font-style:inherit;font-variant-ligatures:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;tab-size:inherit;text-indent:inherit;text-rendering:inherit;text-transform:inherit;white-space:inherit;overflow-wrap:inherit;word-break:inherit;word-break:normal;padding:0}.w-md-editor-text-pre{position:relative;margin:0!important;pointer-events:none;background-color:transparent!important}.w-md-editor-text-pre>code{padding:0!important;font-family:var(--md-editor-font-family)!important;font-size:14px!important;line-height:18px!important}.w-md-editor-text-input{position:absolute;top:0;left:0;height:100%;width:100%;resize:none;color:inherit;overflow:hidden;outline:0;padding:inherit;-webkit-font-smoothing:antialiased;-webkit-text-fill-color:transparent}.w-md-editor-text-input:empty{-webkit-text-fill-color:inherit!important}.w-md-editor-text-pre,.w-md-editor-text-input{word-wrap:pre;word-break:break-word;white-space:pre-wrap}@media all and (-ms-high-contrast: none),(-ms-high-contrast: active){.w-md-editor-text-input{color:transparent!important}.w-md-editor-text-input::selection{background-color:#accef7!important;color:transparent!important}}.w-md-editor-text-pre .punctuation{color:var(--color-prettylights-syntax-comment, #8b949e)!important}.w-md-editor-text-pre .token.url,.w-md-editor-text-pre .token.content{color:var(--color-prettylights-syntax-constant, #0550ae)!important}.w-md-editor-text-pre .token.title.important{color:var(--color-prettylights-syntax-markup-bold, #24292f)}.w-md-editor-text-pre .token.code-block .function{color:var(--color-prettylights-syntax-entity, #8250df)}.w-md-editor-text-pre .token.bold{font-weight:unset!important}.w-md-editor-text-pre .token.title{line-height:unset!important;font-size:unset!important;font-weight:unset!important}.w-md-editor-text-pre .token.code.keyword{color:var(--color-prettylights-syntax-constant, #0550ae)!important}.w-md-editor-text-pre .token.strike,.w-md-editor-text-pre .token.strike .content{color:var(--color-prettylights-syntax-markup-deleted-text, #82071e)!important}.w-md-editor-toolbar-child{position:absolute;border-radius:3px;box-shadow:0 0 0 1px var(--md-editor-box-shadow-color),0 0 0 var(--md-editor-box-shadow-color),0 1px 1px var(--md-editor-box-shadow-color);background-color:var(--md-editor-background-color);z-index:1;display:none}.w-md-editor-toolbar-child.active{display:block}.w-md-editor-toolbar-child .w-md-editor-toolbar{border-bottom:0;padding:3px;border-radius:3px}.w-md-editor-toolbar-child .w-md-editor-toolbar ul>li{display:block}.w-md-editor-toolbar-child .w-md-editor-toolbar ul>li button{width:-webkit-fill-available;height:initial;box-sizing:border-box;padding:3px 4px 2px;margin:0}.w-md-editor-toolbar{border-bottom:1px solid var(--md-editor-box-shadow-color);background-color:var(--md-editor-background-color);padding:3px;display:flex;justify-content:space-between;align-items:center;border-radius:3px 3px 0 0;-webkit-user-select:none;user-select:none;flex-wrap:wrap}.w-md-editor-toolbar.bottom{border-bottom:0px;border-top:1px solid var(--md-editor-box-shadow-color);border-radius:0 0 3px 3px}.w-md-editor-toolbar ul,.w-md-editor-toolbar li{margin:0;padding:0;list-style:none;line-height:initial}.w-md-editor-toolbar li{display:inline-block;font-size:14px}.w-md-editor-toolbar li+li{margin:0}.w-md-editor-toolbar li>button{border:none;height:20px;line-height:14px;background:none;padding:4px;margin:0 1px;border-radius:2px;text-transform:none;font-weight:400;overflow:visible;outline:none;cursor:pointer;transition:all .3s;white-space:nowrap;color:var(--color-fg-default)}.w-md-editor-toolbar li>button:hover,.w-md-editor-toolbar li>button:focus{background-color:var(--color-neutral-muted);color:var(--color-accent-fg)}.w-md-editor-toolbar li>button:active{background-color:var(--color-neutral-muted);color:var(--color-danger-fg)}.w-md-editor-toolbar li>button:disabled{color:var(--md-editor-box-shadow-color);cursor:not-allowed}.w-md-editor-toolbar li>button:disabled:hover{background-color:transparent;color:var(--md-editor-box-shadow-color)}.w-md-editor-toolbar li.active>button{color:var(--color-accent-fg);background-color:var(--color-neutral-muted)}.w-md-editor-toolbar-divider{height:14px;width:1px;margin:-3px 3px 0!important;vertical-align:middle;background-color:var(--md-editor-box-shadow-color)}.w-md-editor{text-align:left;border-radius:3px;padding-bottom:1px;position:relative;color:var(--color-fg-default);--md-editor-font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;--md-editor-background-color: var(--color-canvas-default, #ffffff);--md-editor-box-shadow-color: var(--color-border-default, #d0d7de);box-shadow:0 0 0 1px var(--md-editor-box-shadow-color),0 0 0 var(--md-editor-box-shadow-color),0 1px 1px var(--md-editor-box-shadow-color);background-color:var(--md-editor-background-color);font-family:Helvetica Neue,Helvetica,Arial,sans-serif;display:flex;flex-direction:column}.w-md-editor.w-md-editor-rtl{direction:rtl!important;text-align:right!important}.w-md-editor.w-md-editor-rtl .w-md-editor-preview{right:unset!important;left:0;text-align:right!important;box-shadow:inset -1px 0 0 0 var(--md-editor-box-shadow-color)}.w-md-editor.w-md-editor-rtl .w-md-editor-text{text-align:right!important}.w-md-editor-toolbar{height:fit-content}.w-md-editor-content{height:100%;overflow:auto;position:relative;border-radius:0 0 3px}.w-md-editor .copied{display:none!important}.w-md-editor-input{width:50%;height:100%}.w-md-editor-text-pre>code{word-break:break-word!important;white-space:pre-wrap!important}.w-md-editor-preview{width:50%;box-sizing:border-box;box-shadow:inset 1px 0 0 0 var(--md-editor-box-shadow-color);position:absolute;padding:10px 20px;overflow:auto;top:0;right:0;bottom:0;border-radius:0 0 5px;display:flex;flex-direction:column}.w-md-editor-preview .anchor{display:none}.w-md-editor-preview .contains-task-list li.task-list-item{list-style:none}.w-md-editor-show-preview .w-md-editor-input{width:0%;overflow:hidden;background-color:var(--md-editor-background-color)}.w-md-editor-show-preview .w-md-editor-preview{width:100%;box-shadow:inset 0 0}.w-md-editor-show-edit .w-md-editor-input{width:100%}.w-md-editor-show-edit .w-md-editor-preview{width:0%;padding:0}.w-md-editor-fullscreen{overflow:hidden;position:fixed;z-index:99999;inset:0;height:100%!important}.w-md-editor-fullscreen .w-md-editor-content{height:100%}@layer priority1,priority2,priority3,priority4,priority5,priority6;@layer priority1{:root,.mly112oox9{--mly1v7zpod:0 1px 2px 0 rgba(0, 0, 0, .1), 0 2px 12px 0 rgba(0, 0, 0, .1);--mly1qokt1h:0px 2px 12px 0px rgba(0, 0, 0, .1), 0px 1px 2px 0px rgba(0, 0, 0, .1);--mly1f26pke:0 0 0 1px rgba(204, 211, 219, 1);--mly1yeb1wa:0 0 0 2px rgba(0, 100, 224, 1);--mly7zr30u:rgb(0, 100, 224);--mly1pim1be:rgba(1, 113, 227, .3) 0px 0px 0px 3px inset;--mlywpv3p0:rgba(0, 0, 0, .1)}:root,.mly182du4u{--mly231nev:rgba(10, 19, 23, 1);--mly1i3blw4:rgba(78, 96, 111, 1);--mly16ir2n5:rgba(164, 176, 188, 1);--mly883cce:rgba(0, 100, 224, 1);--mlyeem0lm:rgba(221, 226, 232, 1);--mlyy3jzoq:rgba(255, 255, 255, 1);--mly7qnfvx:rgba(10, 19, 23, 1);--mly3ib3qi:rgba(62, 6, 151, 1);--mlyndhcph:rgba(9, 68, 31, 1);--mlykotp7t:rgba(1, 73, 117, 1);--mlyf25c1a:rgba(66, 133, 244, 1)}:root,.mlyacbved{--mly8s4nhd:rgba(10, 19, 23, 1);--mly130oqjo:rgba(78, 96, 111, 1);--mlywh4rgx:rgba(164, 176, 188, 1);--mly1gq6bli:rgba(255, 255, 255, 1);--mly1jphivy:rgba(164, 176, 188, 1);--mly6i1qgk:rgba(121, 82, 255, 1);--mly1css67u:rgba(7, 109, 41, 1);--mly1fea1fg:rgba(2, 141, 193, 1);--mlyz9tc12:rgba(233, 175, 8, 1);--mly1dryxz7:rgba(0, 100, 224, 1);--mly176ansx:rgba(13, 134, 38, 1);--mlybq1dnb:rgba(227, 25, 59, 1)}:root,.mly16bcggl{--mlygaeq1b:rgba(255, 255, 255, 1);--mlyowxivf:rgba(255, 255, 255, 1);--mlyrhmj74:rgba(241, 244, 247, 1);--mlys9k3ya:rgba(230, 235, 239, 1);--mly1bn1nfc:rgba(37, 54, 63, 1);--mly1rtpqm4:rgba(10, 19, 23, .2);--mlywmj25p:rgba(121, 82, 255, .2);--mly1f95ebd:rgba(36, 187, 94, .2);--mly1jva6ta:rgba(3, 167, 215, .2);--mlyrbis2b:rgba(204, 211, 219, 1);--mly1bs2mf7:rgba(0, 130, 251, .2);--mlywj8cgu:rgba(11, 153, 31, .2);--mlyhsum04:rgba(226, 164, 0, .2);--mly19gk0g3:rgba(227, 25, 59, .2);--mlywfavfw:rgba(0, 0, 0, .05);--mlyenhe5r:rgba(0, 0, 0, .1);--mly1p0ff5j:rgba(255, 255, 255, .5);--mlyjz1sb4:rgba(230, 235, 239, 1);--mly1gkf9zs:rgba(221, 226, 232, 1);--mlyiun9k:rgba(204, 211, 219, 1);--mlyx17nfv:rgba(0, 100, 224, 1);--mly1tptikx:rgba(4, 87, 203, 1);--mly11oqegi:rgba(0, 76, 188, 1)}:root,.mly18uf1kx{--mlynfhokh:none}:root,.mly11fl7i8{--mlyvpnzvp:none}.mly4f1hfu,.mly4f1hfu:root{--mly1bs2mf7:rgba(0, 130, 251, .24);--mlygaeq1b:rgba(20, 22, 25, 1);--mly11oqegi:rgba(74, 126, 205, 1);--mlyx17nfv:rgba(98, 162, 255, 1);--mly1tptikx:rgba(88, 146, 232, 1);--mlyiun9k:rgba(64, 71, 78, 1);--mlyjz1sb4:rgba(48, 53, 58, 1);--mly1gkf9zs:rgba(55, 61, 67, 1);--mly1jva6ta:rgba(3, 167, 215, .24);--mly1p0ff5j:rgba(0, 0, 0, .25);--mlyrbis2b:rgba(71, 76, 82, 1);--mly1rtpqm4:rgba(245, 247, 250, .16);--mly1f95ebd:rgba(36, 187, 94, .24);--mly19gk0g3:rgba(227, 25, 59, .24);--mlyenhe5r:rgba(255, 255, 255, .12);--mlywfavfw:rgba(255, 255, 255, .06);--mlywj8cgu:rgba(11, 153, 31, .24);--mlywmj25p:rgba(121, 82, 255, .24);--mlyowxivf:rgba(30, 33, 37, 1);--mlyrhmj74:rgba(39, 43, 47, 1);--mlys9k3ya:rgba(48, 53, 58, 1);--mly1bn1nfc:rgba(245, 247, 250, 1);--mlyhsum04:rgba(226, 164, 0, .24)}.mly1gnh9hh,.mly1gnh9hh:root{--mly1dryxz7:rgba(98, 162, 255, 1);--mly1fea1fg:rgba(108, 208, 244, 1);--mlywh4rgx:rgba(126, 139, 151, 1);--mly1jphivy:rgba(126, 139, 151, 1);--mly1css67u:rgba(118, 231, 166, 1);--mlybq1dnb:rgba(255, 122, 147, 1);--mly176ansx:rgba(118, 231, 166, 1);--mly8s4nhd:rgba(241, 244, 247, 1);--mly1gq6bli:rgba(5, 5, 5, 1);--mly6i1qgk:rgba(180, 139, 255, 1);--mly130oqjo:rgba(189, 198, 206, 1);--mlyz9tc12:rgba(233, 175, 8, 1)}.mlyfg9r64,.mlyfg9r64:root{--mly1v7zpod:0 1px 2px 0 rgba(0, 0, 0, .6), 0 2px 12px 0 rgba(0, 0, 0, .4);--mly1qokt1h:0px 2px 12px 0px rgba(0, 0, 0, .5), 0px 1px 2px 0px rgba(0, 0, 0, .4);--mly1yeb1wa:0 0 0 2px rgba(98, 162, 255, 1);--mly7zr30u:rgb(98, 162, 255);--mly1pim1be:rgba(98, 162, 255, .3) 0px 0px 0px 3px inset;--mly1f26pke:0 0 0 1px rgba(71, 76, 82, 1);--mlywpv3p0:rgba(255, 255, 255, .15)}.mly74xrg6,.mly74xrg6:root{--mlykotp7t:rgba(108, 208, 244, 1);--mlyf25c1a:rgba(144, 187, 255, 1);--mly16ir2n5:rgba(126, 139, 151, 1);--mly7qnfvx:rgba(221, 226, 232, 1);--mlyndhcph:rgba(118, 231, 166, 1);--mly883cce:rgba(98, 162, 255, 1);--mly231nev:rgba(241, 244, 247, 1);--mlyy3jzoq:rgba(5, 5, 5, 1);--mly3ib3qi:rgba(180, 139, 255, 1);--mly1i3blw4:rgba(189, 198, 206, 1);--mlyeem0lm:rgba(30, 33, 37, 1)}.mly10cf5cp{--mly10mhzaa:var(--mly1f95ebd)}.mlykvi9ht{--mly10mhzaa:var(--mly1jva6ta)}.mly1rve117{--mly10mhzaa:var(--mly1rtpqm4)}.mlyihc5ie{--mly10mhzaa:var(--mlywmj25p)}.mly8bgh0r{--mly13n7235:var(--mly231nev)}.mly1r5zvhd{--mly13n7235:var(--mly3ib3qi)}.mlys5r2en{--mly13n7235:var(--mlykotp7t)}.mly1u6t2w6{--mly13n7235:var(--mlyndhcph)}.mlynu5hmx{--mly1by112x:0}.mly15rdse5{--mly1hmjrsb:var(--mly8s4nhd)}.mly5xbp4t{--mly1hpdckv:var(--mly231nev)}.mly3mt86g{--mly1hpdckv:var(--mlyy3jzoq)}.mly5deeek{--mly1ltarg1:var(--mly231nev)}.mlybcavtu{--mly1ojyoay:var(--mly231nev)}.mlywis56f{--mly1ojyoay:var(--mly3ib3qi)}.mly1eg6ybj{--mly1ojyoay:var(--mlykotp7t)}.mlyy280wj{--mly1ojyoay:var(--mlyndhcph)}.mly7ouyw2{--mly5m5edj:var(--mly1i3blw4)}.mlym9y5t7{--mlynfhokh:block}.mly1bo1i26{--mlyri8z08:0}.mly1ae5hkt{--mlyvpnzvp:block}.mly11ogjb6{--mlyvpnzvp:none}.mlyf8wvcd{--mlyvygx4q:var(--mly1css67u)}.mlyrtwgpv{--mlyvygx4q:var(--mly1fea1fg)}.mly1f8soc4{--mlyvygx4q:var(--mly6i1qgk)}.mly1izbou4{--mlyvygx4q:var(--mly8s4nhd)}.mly1n5rdk7{--mlyxo3nik:var(--mly1gq6bli)}.mlypfd894{--mlyxo3nik:var(--mly8s4nhd)}@keyframes mlyqng64z-B{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.mly1z060rf:is([data-disabled]){--mly1hmjrsb:var(--mlywh4rgx)}.mly1jacekv:is([data-disabled]){--mly1ltarg1:var(--mly16ir2n5)}.mly7h4d18:is([data-disabled]){--mly5m5edj:var(--mly16ir2n5)}.mly1iu3zmn:disabled{--mly1hpdckv:var(--mly1i3blw4)}.mly13vk70h:disabled{--mly1hpdckv:var(--mlyy3jzoq)}.mly1dsjhx:disabled{--mlyxo3nik:var(--mly1gq6bli)}.mlyiv1q3g:disabled{--mlyxo3nik:var(--mlywh4rgx)}.mly1u5txqc:hover{--mly1by112x:.3}.mly1fzkygm:hover{--mlyri8z08:.3}.mly1g9of4s:hover{--mlyvpnzvp:block}.mly157rht3:hover{--mlyvpnzvp:inline-flex}}@layer priority2{.mly5uxqc1{background:#0000}.mly1lrzu1o{background:transparent!important}.mly1md70p1{background:transparent}.mlysu8s4a{background:var(--mly10mhzaa)}.mly1wp621z{background:var(--mly1bs2mf7)}.mly1dyadpi{background:var(--mly1p0ff5j)}.mly1d8y1cu{background:var(--mly1rtpqm4)}.mlycuvecc{background:var(--mlygaeq1b)}.mly7cs2c{background:var(--mlyiun9k)}.mly2taacv{background:var(--mlyjz1sb4)}.mly1bjczhr{background:var(--mlyowxivf)}.mly1cn1p8l{background:var(--mlyrbis2b)}.mly1cmjei3{background:var(--mlys9k3ya)}.mly1kyiqbu{background:var(--mlyx17nfv)}.mly2yh2zd{border:1px solid #e0e0e0}.mly8fuzfi{border:1px solid #efefef}.mly1dc9p4k{border:1px solid red}.mly27xtdb{border:1px solid rgb(239,239,239)}.mlyfj9a5l{border:1px solid transparent}.mly1vspu6z{border:1px solid var(--malloy-composer-form-background,#efefef)}.mlyss3vti{border:1px solid var(--malloy-composer-form-border,#ececed)}.mlyv3vvaf{border:1px solid var(--malloy-composer-form-focus,#4285f4)}.mlyhu5y25{border:1px solid var(--mlyrbis2b)}.mly1gs6z28{border:none}.mly15r89dc{grid-area:1 / 1}.mly1ghz6dp{margin:0}.mlys8nxjv{margin:4px 12px 0}.mlynfbntj{margin:5px 0}.mly16zck5j{margin:5px}.mlykib98w{margin:8px}.mly1bpp3o7{margin:auto}.mlywp4ipm{padding:0 24px 24px}.mlyehqz9p{padding:0 4px}.mly1l4tkcb{padding:0 8px 8px}.mly1717udv{padding:0}.mly1b4vry6{padding:10px 0}.mly7z7khe{padding:10px}.mlyc7ga6q{padding:12px}.mly1tamke2{padding:16px}.mly1e41zw8{padding:1px 5px}.mlyfvt8nb{padding:2px 12px 2px 6px}.mlybsehbd{padding:2px 3px}.mlyxzb6uj{padding:2px 4px}.mly195ery5{padding:3.75px 7px}.mly1gqu590{padding:3px 10px}.mly34lxi1{padding:3px 3px 3px 10px}.mly92jh8x{padding:4px 0 8px}.mlyztvwtv{padding:4px 0}.mly1fut7tt{padding:4px 12px 12px}.mlytdwleo{padding:4px 12px}.mly9cpjcd,.mlydqdrvq{padding:4px 8px}.mlyfawy5m{padding:4px}.mly17qkr04{padding:5px 0}.mly36usyh{padding:5px 10px}.mly14odnwx{padding:5px}.mly153ncpu{padding:8px 12px}.mlye8ttls{padding:8px}.mly1tx4nyv:is([data-state=checked]){background:var(--mly1bs2mf7)}.mly1vg538p:is([data-highlighted]){background:var(--mlywfavfw)}.mly1julgsk:is([data-highlighted]):is([data-state=checked]){background:var(--mly1bs2mf7)}.mly1b1kpiu:hover{background:var(--mly1gkf9zs)}.mly1cbp0pj:hover{background:var(--mly1tptikx)}.mly1xbhkwo:hover{background:var(--mlywfavfw)}.mly111eqgs:active{background:var(--mly11oqegi)}.mly1v24qdc:active{background:var(--mlyenhe5r)}.mlybc727s:active{background:var(--mlyiun9k)}}@layer priority3{.mly1akygb0{border-color:none}.mly10bk7bj{border-color:var(--malloy-composer-focus,#c3d7f7)}.mlyv66to0{border-color:var(--mly7zr30u)}.mly17v018m{border-color:var(--mlyrbis2b)}.mly11zuszs{border-radius:0 0 10px 10px}.mly19ctu66{border-radius:0 4px 4px 0}.mlyq516e8{border-radius:10px 10px 0 0}.mly1q4ynmn{border-radius:10px}.mly4pepcl{border-radius:12px}.mly18zih8k{border-radius:3px}.mlytah5vv{border-radius:4px 0 0 4px}.mly12oqio5{border-radius:4px}.mly1f96onm{border-radius:50px}.mly1sxf85j{border-radius:5px}.mly1kogg8i{border-radius:6px}.mlyur7f20{border-radius:8px}.mly10hpsqq{border-radius:9999px}.mly1pjcqnp{border-radius:inherit}.mly1ruvecq{border-right:1px solid var(--mlyrbis2b)}.mlyng3xce{border-style:none}.mly1y0btm7{border-style:solid}.mlye536se{border-top:1px solid #e0e0e0}.mly77krkw{border-top:1px solid var(--malloy-composer-form-border,#ececec)}.mlyc342km{border-width:0}.mlymkeg23{border-width:1px}.mly3psx0u{flex:0 0 auto}.mly98rzlu{flex:1}.mly883omv{gap:10px}.mlyou54vl{gap:16px}.mly12mrbbr{gap:1px}.mly1665zp3{gap:24px}.mly195vfkc{gap:2px}.mly1ed6fcf{gap:3px}.mly1jnr06f{gap:4px}.mly1nejdyq{gap:5px}.mly167g77z{gap:8px}.mly623te4{grid-column:span 2}.mly1a80n4u{grid-column:span 3}.mlye8uvvx{list-style:none}.mly1a2a7pz{outline:none}.mlyysyzu8{overflow:auto}.mlyb3r6kr{overflow:hidden}.mly1rea2x4{overflow:visible}.mly1ku5rj1{place-items:center}.mly1hl2dhg{text-decoration:none}.mly14znju7{transition:opacity .5s ease}.mly1fxp9ov:hover{border-color:var(--malloy-composer-focus,#c3d7f7)}.mlyetl2wx:focus{border-color:#4285f4}}@layer priority4{.mly1ua5tub{-webkit-box-orient:vertical}.mly1gzmk7r{-webkit-line-clamp:3}.mlyc26acl{align-content:center}.mly6s0dn4{align-items:center}.mlypqajaz{align-items:end}.mly1cy8zhl{align-items:flex-start}.mly7a106z{align-items:start}.mly1071x5a{align-items:top}.mly1c74tu6{animation-duration:2s}.mlya4qsjk{animation-iteration-count:infinite}.mly8jsasv{animation-name:mlyqng64z-B}.mly1esw782{animation-timing-function:linear}.mly1vzefiq{background-color:#f0f6ff}.mlyjbqb8w{background-color:transparent}.mly1jjku57{background-color:var(--malloy-composer-form-disabledBackground,#f6f6f6)}.mly6wxqrg{background-color:var(--malloy-composer-form-focusBackground,#f0f6ff)}.mlyrkwa2d{background-color:var(--mly19gk0g3)}.mly1pcjto7{background-color:var(--mly1bn1nfc)}.mly1pnbjq1{background-color:var(--mly1bs2mf7)}.mlyn8dcc1{background-color:var(--mlygaeq1b)}.mly1x7w6om{background-color:var(--mlyhsum04)}.mly1yduej5{background-color:var(--mlyowxivf)}.mly13z5u0c{background-color:var(--mlyrhmj74)}.mlyzh2ni8{background-color:var(--mlys9k3ya)}.mly1x3oq6j{background-color:var(--mlywj8cgu)}.mly12peec7{background-color:#fff}.mly7dvq3r{border-buttom-color:var(--mlyrbis2b)}.mly1mwwwfo{border-collapse:collapse}.mlyzteli5{border-right-background:var(--mlyrbis2b)}html:not([dir=rtl]) .mlydid9jw{box-shadow:0 0 0 1px var(--mly7zr30u) inset,var(--mly1pim1be)}html[dir=rtl] .mlydid9jw{box-shadow:0 0 0 1px var(--mly7zr30u) inset,var(--mly1pim1be)}html:not([dir=rtl]) .mly1kmqopl{box-shadow:0 0 5px #0000001a,0 0 1px #0000001a}html[dir=rtl] .mly1kmqopl{box-shadow:0 0 5px #0000001a,0 0 1px #0000001a}html:not([dir=rtl]) .mly5n1uv4{box-shadow:0 1px 2px #0000001a,0 2px 12px #0000001a}html[dir=rtl] .mly5n1uv4{box-shadow:0 1px 2px #0000001a,0 2px 12px #0000001a}.mly1a3rnpv{box-shadow:0 1px 5px 1px #0000001a}html:not([dir=rtl]) .mly17fq3gk{box-shadow:0 2px 12px #0000001a,0 1px 2px #0000001a}html[dir=rtl] .mly17fq3gk{box-shadow:0 2px 12px #0000001a,0 1px 2px #0000001a}.mly1gnnqk1{box-shadow:none}.mly1ga53z4{box-shadow:var(--mly1f26pke)}.mly118a1h2{box-shadow:var(--mly1pim1be)}.mly8dadwf{box-shadow:var(--mly1qokt1h)}.mly1towwp7{box-shadow:var(--mly1v7zpod)}.mly1p9pjdr{box-shadow:var(--mly1yeb1wa)}.mly9f619{box-sizing:border-box}.mly1v5ugh9{color:#505050}.mly358b0h{color:#909090}.mly1e2nbdu{color:red}.mlyizdh9v{color:#5f6368}.mly183j0n7{color:#e4e6eb}.mly19co3pv{color:transparent}.mly1pc1dlx{color:var(--malloy-composer-form-foreground,#5f6368)}.mly1r0d382{color:var(--mly130oqjo)}.mly1xre2ib{color:var(--mly13n7235)}.mlywzxoxx{color:var(--mly16ir2n5)}.mly1l99qkd{color:var(--mly176ansx)}.mly1evcnq1{color:var(--mly1css67u)}.mly1tw9ct1{color:var(--mly1dryxz7)}.mly1h091fy{color:var(--mly1fea1fg)}.mly1kiansi{color:var(--mly1gq6bli)}.mly1mguc6l{color:var(--mly1hmjrsb)}.mlyaerthn{color:var(--mly1hpdckv)}.mly9dwj6z{color:var(--mly1i3blw4)}.mlyann5r3{color:var(--mly1jphivy)}.mly12lmysb{color:var(--mly1ltarg1)}.mly1ard1hs{color:var(--mly1ojyoay)}.mly1ue28sr{color:var(--mly231nev)}.mlyydnxy5{color:var(--mly3ib3qi)}.mly15jt5ur{color:var(--mly5m5edj)}.mly1ywypuw{color:var(--mly6i1qgk)}.mly17rwmdj{color:var(--mly883cce)}.mly1p68tcb{color:var(--mly8s4nhd)}.mly109d434{color:var(--mlybq1dnb)}.mlya26k3e{color:var(--mlyeem0lm)}.mly1nwq7qm{color:var(--mlyf25c1a)}.mlywn9h7t{color:var(--mlyvygx4q)}.mly16un6j3{color:var(--mlywh4rgx)}.mlyuk6yi3{color:var(--mlyxo3nik)}.mly7neac5{color:var(--mlyz9tc12)}.mlyt0e3qv{cursor:default}.mly7eptgl{cursor:ew-resize}.mly1ipiool{cursor:initial}.mly1ypdohk{cursor:pointer}.mly104kibb{display:-webkit-box}.mly78zum5{display:flex}.mlyrvj5dj{display:grid}.mly1rg5ohu{display:inline-block}.mly3nfvp2{display:inline-flex}.mlywz0xwf{display:inline-grid}.mly1s85apg{display:none}.mly1vsucm1{display:var(--mlynfhokh)}.mly2b4tyj{display:var(--mlyvpnzvp)}.mlydt5ytf{flex-direction:column}.mly1q0g3np{flex-direction:row}.mly1c4vz4f{flex-grow:0}.mly1iyjqo2{flex-grow:1}.mly2lah0s{flex-shrink:0}.mly1a02dak{flex-wrap:wrap}.mly6icuqf{font-family:sans-serif}.mly1rj5sg5{font-family:SF Pro Text,-apple-system,system-ui,sans-serif}.mly12xrqmb{font-family:var(--malloy-composer-fontFamily,sans-serif)}.mlyfifm61{font-size:12px}.mlyif65rj{font-size:14px}.mly1j61zf2{font-size:16px}.mlymhiqyu{font-size:var(--malloy-composer-fontSize,14px)}.mly64z8l9{font-size:var(--malloy-composer-menu-fontSize,14px)}.mly1j61x8r{font-style:normal}.mlyo1l8bm{font-weight:400}.mly1s688f{font-weight:600}.mly1xlr1w8,.mly117nqv4{font-weight:700}.mly1fcty0u{font-weight:400}.mly1mt1orb{grid-auto-flow:column}.mlysd5ean{grid-auto-rows:max-content}.mly15396mt{grid-template-columns:100px auto 100px}.mly52fmzj{grid-template-columns:1fr auto}.mly1g3yg12{grid-template-columns:auto 1fr auto}.mlybyjr8{grid-template-columns:auto}.mly16kridx{grid-template-columns:min-content 1fr min-content}.mlyl56j7k{justify-content:center}.mly13a6bvl{justify-content:flex-end}.mly1nhvcw1{justify-content:flex-start}.mly1rfj78v{justify-content:left}.mly1lvf691{justify-content:right}.mly1l1ennw{justify-content:space-around}.mly1qughib{justify-content:space-between}.mlylqzeqv{justify-content:start}.mly11e9jwx{leading-trim:both}.mly1gu5id8{letter-spacing:-.24px}.mly12oo3zp{letter-spacing:0}.mly1d3mw78{line-height:16px}.mly1rl49lg{line-height:2.2em}.mly1fc57z9{line-height:20px}.mly1o2sk6j{line-height:24px}.mly1vqud6w{opacity:70%}.mly1d3ksz1{opacity:var(--mly1by112x)}.mly15sj6ns{opacity:var(--mlyri8z08)}.mly47corl{pointer-events:none}.mly10l6tqk{position:absolute}.mlyixxii4{position:fixed}.mly1n2onr6{position:relative}.mly7wzq59{position:sticky}.mly2b8uid{text-align:center}.mlydpxx8g{text-align:left}.mly1vqy1sf{text-edge:cap}.mlylyipyv{text-overflow:ellipsis}.mly6mezaz{text-transform:none}.mly87ps6o{user-select:none}.mlyxymvpz{vertical-align:middle}.mly1n8ftqi{vertical-align:text-top}.mly16dsc37{vertical-align:top}.mlylshs6z{visibility:hidden}.mlynpuxes{visibility:visible}.mlyuxw1ft{white-space:nowrap}.mly126k92a{white-space:pre-wrap}.mly1so62im{will-change:transform}.mly1vvkbs{word-wrap:break-word}.mly35i7{writing-mode:sideways-lr}.mly1ja2u2z{z-index:0}.mly1vjfegm{z-index:1}.mly11uqc5h{z-index:100}.mlyhtitgo{z-index:2}.mly14vaotu:is([data-state=active]){background-color:var(--mly1bs2mf7)}.mly14kfzap:is([data-disabled]){color:var(--mly16ir2n5)}.mlyb0tsu4:is([data-state=active]){color:var(--mly883cce)}.mly5ezrf1:is([data-disabled]){cursor:not-allowed}.mly1uifvsu:is([data-state=active]){font-weight:700}.mly1s07b3s:disabled{cursor:not-allowed}.mly1haqvef:hover{background-color:#dde2e8}.mlyjg9ulk:hover{background-color:#efefef}.mlyt89l8w:hover{background-color:var(--malloy-composer-form-focusBackground,#f0f6ff)}.mly1vtmp6m:hover{background-color:var(--mlyrhmj74)}.mlyk1e6ed:hover{box-shadow:#ccd3db4d 0 0 0 3px inset}.mlytw1abo:focus{background-color:#fff}}@layer priority5{.mlybmeysy{border-bottom-color:var(--mlyrbis2b)}.mly1q0q8m5{border-bottom-style:solid}.mlyso031l{border-bottom-width:1px}.mlyv3cp8q{border-right-color:var(--mlyrbis2b)}.mly32b0ac{border-right-style:solid}.mlys1s249{border-right-width:1px}.mlydwjgp9{border-top-color:var(--mlyrbis2b)}.mly13fuv20{border-top-style:solid}.mly178xt8z{border-top-width:1px}.mly1ey2m1c{bottom:0}.mlyqtp20y{height:0}.mly5yr21d{height:100%}.mlypyat2d{height:100px}.mlyn866dk{height:136px}.mly1v9usgg{height:14px}.mlywrnneb{height:16.5px}.mlylup9mm{height:16px}.mlymix8c7{height:18px}.mlyjm9jq1{height:1px}.mly1m3v4wt{height:200px}.mlyk2yuxw{height:209.5px}.mly1qx5ct2{height:20px}.mlyxk0z11{height:24px}.mlyd7y6wv{height:26px}.mly1fgtraw{height:28px}.mlyc9qbxq{height:36px}.mlyng8ra{height:60px}.mlydk7pt{height:8px}.mlylo07zb{height:90px}.mlyt7dq6l{height:auto}.mly10msahz{height:calc(100% - 4px)}.mly1ktj5wk{height:calc(100% - 8px)}.mlyu96u03{left:0}.mly12nagc{margin-bottom:4px}.mlyu06os2{margin-bottom:5px}.mly1e56ztr{margin-bottom:8px}.mlyj3b58b{margin-left:0}.mly1tpqehw{margin-left:12px}.mlyq1n1xh{margin-left:16px}.mly1iog12x{margin-left:4px}.mlyet2fuk{margin-left:8px}.mly1yf7rl7{margin-right:0}.mly1xmf6yo{margin-top:8px}.mly1rvw3h8{max-height:136px}.mly1hkcv85{max-height:200px}.mly1xyq3li{max-height:20em}.mlyq3t0pi{max-height:280px}.mlyuyqlj2{max-height:300px}.mly1phlbz0{max-height:400px}.mly1jcbksy{max-height:420px}.mly3d5gib{max-height:50vh}.mly1l4ul0t{max-height:75vh}.mly1kbvuzt{max-height:var(--radix-tooltip-content-available-height)}.mlyqyhut4{max-width:16.5px}.mly1pdpmub{max-width:264px}.mly1jkqq1h{max-width:280px}.mly1dc814f{max-width:350px}.mlyxc7z9f{max-width:360px}.mly1j9u4d2{max-width:400px}.mly1lr1uin{max-width:420px}.mlymcgfsh{max-width:60px}.mly14zcgw3{max-width:75vw}.mly2lwn1j{min-height:0}.mly4x6u8j{min-width:16.5px}.mlygc0pbm{min-width:1px}.mlyt4ypqs{min-width:20px}.mlyytlacd{min-width:224px}.mlylm99nl{min-width:240px}.mly2ixbly{min-width:250px}.mlyfvyar9{min-width:60px}.mly1onzeue{min-width:95px}.mly1odjw0f{overflow-y:auto}.mly18d9i69{padding-bottom:0}.mly1l90r2v{padding-bottom:16px}.mlyjkvuk6{padding-bottom:4px}.mlywib8y2{padding-bottom:8px}.mlynm25rq{padding-left:16px}.mly6wrskw{padding-left:4px}.mly163pfp{padding-left:8px}.mlymzs88n{padding-right:4px}.mlyy13l1i{padding-right:8px}.mly1nn3v0j{padding-top:2px}.mly1iorvi4{padding-top:4px}.mly123j3cw{padding-top:5px}.mly1y1aw1k{padding-top:8px}.mly1bkpikb{right:-2px}.mly3m8u43{right:0}.mly13vifvy{top:0}.mlynalus7{width:0}.mlyh8yej3{width:100%}.mlynrytzq{width:10em}.mly6jxa94{width:14px}.mly18kybhu{width:15em}.mlyjxf2f8{width:16.5px}.mly1kky2od{width:16px}.mly1xp8n7a{width:18px}.mly1i1rx1s{width:1px}.mlyw4jnvo{width:20px}.mlyvy4d1p{width:24px}.mly1f1nlb9{width:25%}.mlyqyf9gi{width:250px}.mly1hfn5x7{width:260px}.mlygd8bvy{width:28px}.mlybl57os{width:323px}.mlyxsgkw5{width:350px}.mly869kya{width:5.5em}.mly1ftt334{width:5px}.mly14rvwrp{width:600px}.mly1247r65{width:60px}.mly1xc55vz{width:8px}.mlym6i5cn{width:90%}.mly10lvyaf{width:calc(100% - 12px)}.mly1rxuhir{width:calc(100% - 22px)}.mly112rgfc{width:calc(100% - 40)}.mly1g65f5b{width:var(--radix-tooltip-trigger-width)}}@layer priority6{.mlyf2qczu::placeholder{color:var(--mly1i3blw4)}}div[data-radix-popper-content-wrapper]{z-index:100!important}