@aglyn/aglyn 1.0.0-beta.236 → 1.0.0-beta.238

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 (38) hide show
  1. package/package.json +11 -11
  2. package/src/lib/app-utils/docs-help-sections.generated.js +9 -6
  3. package/src/lib/app-utils/docs-help-sections.generated.js.map +1 -1
  4. package/src/lib/app-utils/docs-help.generated.d.ts +6 -6
  5. package/src/lib/app-utils/docs-help.generated.js +9 -3
  6. package/src/lib/app-utils/docs-help.generated.js.map +1 -1
  7. package/src/lib/app-utils/docs-index.generated.js +246 -22
  8. package/src/lib/app-utils/docs-index.generated.js.map +1 -1
  9. package/src/lib/app-utils/element-ui.d.ts +21 -2
  10. package/src/lib/app-utils/element-ui.js +29 -2
  11. package/src/lib/app-utils/element-ui.js.map +1 -1
  12. package/src/lib/app-utils/foreign-dom-guard.d.ts +17 -0
  13. package/src/lib/app-utils/foreign-dom-guard.js +66 -0
  14. package/src/lib/app-utils/foreign-dom-guard.js.map +1 -0
  15. package/src/lib/app-utils/forms.d.ts +11 -0
  16. package/src/lib/app-utils/forms.js.map +1 -1
  17. package/src/lib/app-utils/media-filter.js +5 -1
  18. package/src/lib/app-utils/media-filter.js.map +1 -1
  19. package/src/lib/app-utils/media-metadata.d.ts +3 -2
  20. package/src/lib/app-utils/media-metadata.js +4 -0
  21. package/src/lib/app-utils/media-metadata.js.map +1 -1
  22. package/src/lib/app-utils/media-picker-context.d.ts +5 -1
  23. package/src/lib/app-utils/media-picker-context.js +9 -0
  24. package/src/lib/app-utils/media-picker-context.js.map +1 -1
  25. package/src/lib/app-utils/plugin-api-rate-limit.js +3 -1
  26. package/src/lib/app-utils/plugin-api-rate-limit.js.map +1 -1
  27. package/src/lib/app-utils/release-flags.js +6 -6
  28. package/src/lib/app-utils/release-flags.js.map +1 -1
  29. package/src/lib/app-utils/upload-inspection.js +88 -0
  30. package/src/lib/app-utils/upload-inspection.js.map +1 -1
  31. package/src/lib/foundation/definitions/components.types.d.ts +6 -0
  32. package/src/lib/foundation/definitions/components.types.js.map +1 -1
  33. package/src/lib/foundation/definitions/organization.types.d.ts +7 -0
  34. package/src/lib/foundation/definitions/organization.types.js.map +1 -1
  35. package/src/lib/plugin-manager/first-party-plugins.generated.js +18 -0
  36. package/src/lib/plugin-manager/first-party-plugins.generated.js.map +1 -1
  37. package/src/lib/plugin-manager/stock-photo-provider.d.ts +5 -0
  38. package/src/lib/plugin-manager/stock-photo-provider.js.map +1 -1
@@ -205,14 +205,14 @@ export const DOCS_SECTION_INDEX = [
205
205
  title: 'AI credits',
206
206
  heading: 'What things cost',
207
207
  anchor: '#what-things-cost',
208
- text: 'What a request costs depends on how much the AI reads and writes, so the figures below are typical, not fixed. Every job shows its estimate before you confirm it.\n| Request | Typical cost |\n| An answer in the chat, a rewrite, a summary | A few credits |\n| An answer quoted straight from the docs | Free |\n| A vector illustration, icon or logo mark | About 18 credits a picture |\n| A photo, art or design picture | About 108 credits a picture (about 75 on Free) |\n| A new site\'s look | A few credits |\n| A page from a brief | About 50 credits for each section, plus planning |\n| A layout, form, component or email design | About 50 credits each |\n| A new site started with AI, paid plan | About 1,050 for 3 pages to 2,600 for 8 |\n| A new site started with AI, Free plan | Always within the 300 Free credits; the window shows the most it can cost |\n| Products, booking services, overlays, A/B tests, funnels, variables in a chat build | Almost nothing |\n| Stock photos in an AI site | Nothing |\nA model you choose with the Model switch can cost more or less than Auto; the switch shows each model\'s cost. See Choosing a model.'
208
+ text: 'What a request costs depends on how much the AI reads and writes, so the figures below are typical, not fixed: what jobs like it cost on real builds. Every job shows its estimate before you confirm it.\n| Request | Typical cost |\n| An answer in the chat, a rewrite, a summary | A few credits |\n| An answer quoted straight from the docs | Free |\n| A vector illustration, icon or logo mark | About 18 credits a picture |\n| A photo, art or design picture | About 108 credits a picture (about 75 on Free) |\n| A new site\'s look | A few credits |\n| A page from a brief | About 30 credits for a page of five sections (about 6 a section), plus planning |\n| A layout (header and footer) | About 25 credits |\n| A form | About 30 credits |\n| A component or email design | About 30 credits |\n| A new site started with AI, paid plan | About 170 for 3 pages to 320 for 8 |\n| A new site started with AI, Free plan | About 140 for two pages, within the 300 Free credits |\n| Products, booking services, overlays, A/B tests, funnels, variables in a chat build | Almost nothing |\n| Stock photos in an AI site | Nothing |\nA model you choose with the Model switch can cost more or less than Auto; the switch shows each model\'s cost. See Choosing a model.'
209
209
  },
210
210
  {
211
211
  path: '/ai/ai-credits',
212
212
  title: 'AI credits',
213
213
  heading: 'Before a job starts',
214
214
  anchor: '#before-a-job-starts',
215
- text: 'Every job tells you what it will cost before it spends anything:\n- A plan shows Estimated cost: about N credits beside Confirm plan. What it really costs is what its steps spend, and you can watch that add up on the job.\n- On the Free plan, a job is checked against the most it could cost, not a typical figure, and against the credits you have left this month. The Start your site window, for example, says Up to about N AI credits and how many of your free credits are left until they reset. If what is left cannot cover it, the start button is turned off and the window says so, with Upgrade. If fewer pages would fit, it says that too.\n- A picture shows its credits per picture and in total before Create.'
215
+ text: 'Every job tells you what it will cost before it spends anything:\n- A plan shows Estimated cost: About N credits (up to M) beside Confirm plan: about what jobs like it cost on real builds, and the most it can cost. What it really costs is what its steps spend, and you can watch that add up on the job. Try again shows the same for the parts it will run again.\n- On the Free plan, a job is checked against the credits you have left this month, and the window or plan card shows how many that is. A job that will very likely fit starts with no question asked. One that will likely use more than you have left says so before it starts, for example This build is about 106 credits (up to 650). You have 90 left, so it will build as much as it can and pause when your credits run out. Nothing starts until you choose:\n- Build what fits builds as much as your credits cover, then pauses. Choose Resume after you upgrade or when your credits renew, and it carries on from where it stopped. Nothing it already built is built or charged again.\n- Build the home page first builds a smaller first version: the home page and what it needs, such as its layout and the form it shows. Ask for the rest later.\n- Upgrade opens Billing.\nWith no free credits left at all, nothing can start until they renew or you upgrade.\n- A picture shows its credits per picture and in total before Create.'
216
216
  },
217
217
  {
218
218
  path: '/ai/ai-credits',
@@ -233,7 +233,7 @@ export const DOCS_SECTION_INDEX = [
233
233
  title: 'AI credits',
234
234
  heading: 'Credits given back',
235
235
  anchor: '#credits-given-back',
236
- text: 'When a job fails because of something on our side, such as an AI provider error, a step that timed out, or a plan that still broke the building rules after being asked again, its credits are given back automatically:\n- all of them, if it built nothing;\n- the failed step\'s, if it had already built something, which you keep.\nThe job says This one\'s on us — you weren\'t charged. and how many credits came back. Up to three jobs a day are given back this way.\nCredits are not given back when you cancel a job yourself (you pay for what ran until then), or when the AI declines what the brief asked for. A picture that is declined or does not come out is never charged in the first place.'
236
+ text: 'When a job fails because of something on our side, such as an AI provider error, a step that timed out, or a plan that still broke the building rules after being asked again, its credits are given back automatically:\n- all of them, if it built nothing;\n- the failed step\'s, if it had already built something, which you keep.\nThe job says This one\'s on us — you weren\'t charged. and how many credits came back. Up to three jobs a day are given back this way.\nCredits are not given back when you cancel a job yourself (you pay for what ran until then, and credits held for steps that never ran are released; see Cancel a job), or when the AI declines what the brief asked for. A picture that is declined or does not come out is never charged in the first place.'
237
237
  },
238
238
  {
239
239
  path: '/ai/ai-credits',
@@ -275,7 +275,7 @@ export const DOCS_SECTION_INDEX = [
275
275
  title: 'AI jobs and activity',
276
276
  heading: 'One job\'s page',
277
277
  anchor: '#one-jobs-page',
278
- text: 'A job\'s page shows each step as it happens, with its own state (Done, Waiting, In progress, Paused, Not built or Couldn\'t be built) and the credits each step used. From there you can:\n- Confirm plan, when a plan is waiting for you;\n- Resume a job that paused for credits, or Get more AI credits;\n- Try again, or Try again what failed to build only the parts that failed;\n- open what it built: View your site, Edit your pages, or the draft itself.\nFor a new site this is the Building your site page; see Start a new site with AI.'
278
+ text: 'A job\'s page shows each step as it happens, with its own state (Done, Waiting, In progress, Paused, Not built or Couldn\'t be built) and the credits each step used. From there you can:\n- Confirm plan, when a plan is waiting for you;\n- Resume a job that paused for credits, or Get more AI credits;\n- Try again, or Try again what failed to build only the parts that failed;\n- Cancel a job that is still running (see Cancel a job);\n- open what it built: View your site, Edit your pages, or the draft itself.\nFor a new site this is the Building your site page; see Start a new site with AI.'
279
279
  },
280
280
  {
281
281
  path: '/ai/ai-jobs-and-activity',
@@ -289,7 +289,7 @@ export const DOCS_SECTION_INDEX = [
289
289
  title: 'AI jobs and activity',
290
290
  heading: 'Cancel a job',
291
291
  anchor: '#cancel-a-job',
292
- text: 'Cancel job in the window that started a job, or Cancel in the AI jobs list, stops it. What it built so far is kept as drafts. A canceled job is charged for what it spent until then.'
292
+ text: 'You can stop a job at any point before it finishes. Cancel is on:\n- the job\'s own page, such as Building your site;\n- each row of a site\'s AI jobs page, from the row\'s ⋮ menu (Cancel job);\n- each running job in the AI jobs list in Assist, which the AI chip in the top bar opens.\nEach asks first, in a Cancel this AI job? window. Choose Cancel job to stop, or Keep building to let it carry on. Cancel needs the Generate with AI permission on the site.\nWhat happens when you cancel:\n- Nothing more runs. If a step is in progress, it stops, or finishes if it is about to, and the job shows Stopping until it has. Nothing after it starts.\n- What it built stays, as drafts. Pages, layouts and forms it already made are kept as unpublished drafts for you to open, edit or delete. A canceled job never publishes anything, so your live site is unchanged.\n- You pay only for what ran. Credits held for the steps that did not run are released. The steps that finished stay charged, and the job says how much, for example This job used 42 credits before it stopped. A job you cancel is not counted as a failure, so it is not given back and you are not sent a "job stopped" notice.\n- It is recorded. Canceled an AI generation is added to the site\'s activity, with who canceled it.\nA canceled job shows Canceled in every list. A job that is already Done or Failed cannot be canceled; its Cancel is turned off and says why.\nCancel a new site {#cancel-a-new-site}\nIf you cancel a site you started with AI, the Building your site page says You canceled your site and offers:\n- Start again, which reopens the questions with your answers filled in, for a fresh job;\n- Use the starter site instead, which gives the site the starter home page. It is offered only while the job had not built anything yet.'
293
293
  },
294
294
  {
295
295
  path: '/ai/ai-jobs-and-activity',
@@ -394,7 +394,7 @@ export const DOCS_SECTION_INDEX = [
394
394
  title: 'Build from Assist chat',
395
395
  heading: 'The plan card',
396
396
  anchor: '#the-plan-card',
397
- text: 'The card shows Planning what to build on this site… while the plan is made, then the Proposed plan, one line per part:\n- Reuses something the site already has, and what for;\n- Creates something new, and why nothing you have will do;\n- Builds the page with its title, address, layout and sections;\n- any video player a page will carry, and what loading it costs your visitors.\nUnder the lines is the Estimated cost in credits. It is an estimate: what the build costs is what its steps spend. If you asked for the new pages to go live, a Publish the new pages when they are built box is there too, unticked until you tick it.\nNothing is built while the card waits. The plan follows the building rules, and a plan that breaks them, or asks for more than your plan includes, is stopped before you are asked to confirm it.'
397
+ text: 'The card shows Planning what to build on this site… while the plan is made, then the Proposed plan, one line per part:\n- Reuses something the site already has, and what for;\n- Creates something new, and why nothing you have will do;\n- Builds the page with its title, address, layout and sections;\n- any video player a page will carry, and what loading it costs your visitors.\nUnder the lines is the Estimated cost, such as About 106 credits (up to 650): about what builds like it cost, and the most it can cost. What the build costs is what its steps spend. On the Free plan the card also says how many free credits you have left this month. If you asked for the new pages to go live, a Publish the new pages when they are built box is there too, unticked until you tick it.\nIf the build will likely use more than your credits left, the card says so instead of offering Confirm plan, and gives you three choices: Build what fits (it builds what your credits cover and pauses, then Resume carries on), Build the home page first (only the home page and what it needs), or Upgrade. See Before a job starts.\nNothing is built while the card waits. The plan follows the building rules, and a plan that breaks them, or asks for more than your plan includes, is stopped before you are asked to confirm it.'
398
398
  },
399
399
  {
400
400
  path: '/ai/assist-builds',
@@ -408,7 +408,7 @@ export const DOCS_SECTION_INDEX = [
408
408
  title: 'Build from Assist chat',
409
409
  heading: 'One job, many parts',
410
410
  anchor: '#one-job-many-parts',
411
- text: 'Everything in the plan is built by one job, each part by the same builder that makes it on its own page, in the order the parts need each other: the layout and the form before the page that places them.\n- Each part stands on its own. A part that fails does not undo the others. What depends on it is built without it, or not built, and the card says which.\n- Everything is a draft. Pages are unpublished drafts unless you ticked the publish box. Products have no photo and the price you stated, if any. Booking services and funnels are drafts to activate. Overlays and automations are switched off, A/B tests are stopped, and campaigns are unsent and aimed at nobody.\n- Names are your own. A new variable or function never takes a name the site already uses.\nWhen it is done the card says how many parts were built, such as 5 of 6 built; 1 failed. Try again what failed builds only the parts that failed.\nTo change something it made, ask in the chat, such as make the about page shorter. Assist opens that draft and proposes the change there.'
411
+ text: 'Everything in the plan is built by one job, each part by the same builder that makes it on its own page, in the order the parts need each other: the layout and the form before the page that places them.\n- Each part stands on its own. A part that fails does not undo the others. What depends on it is built without it, or not built, and the card says which.\n- Everything is a draft. Pages are unpublished drafts unless you ticked the publish box. Products have no photo and the price you stated, if any. Booking services and funnels are drafts to activate. Overlays and automations are switched off, A/B tests are stopped, and campaigns are unsent and aimed at nobody.\n- Names are your own. A new variable or function never takes a name the site already uses.\nWhen it is done the card says how many parts were built, such as 5 of 6 built; 1 failed. Try again what failed builds only the parts that failed, and shows what that is likely to cost.\nIf your credits run out partway, the card says Paused. What is built so far is kept. Choose Resume after you upgrade or when your credits renew, and it carries on with the next part.\nTo change something it made, ask in the chat, such as make the about page shorter. Assist opens that draft and proposes the change there.'
412
412
  },
413
413
  {
414
414
  path: '/ai/assist-builds',
@@ -1157,7 +1157,7 @@ export const DOCS_SECTION_INDEX = [
1157
1157
  title: 'Product copy and catalogs with AI',
1158
1158
  heading: 'Propose a first catalog',
1159
1159
  anchor: '#propose-a-first-catalog',
1160
- text: 'On the products page, press Create with AI beside Add product (and beside Add your first product while the catalog is empty), or Propose products in Build your catalog with AI — both open the same brief. Propose products takes a brief, such as "a candle studio: hand-poured soy candles in 8 oz and 16 oz jars, and wax melts", and proposes up to twelve products, usually six or more unless your brief says how many: each with a name, type, description, tags, options, a search listing and a sentence saying what its photo should show.\nReview the table, untick any you do not want, and press Create drafts. Each product is created as a draft:\n- It starts at a default price of $25 on every variant, for you to change in the product editor. You may clear a price on purpose: the product still saves, the table marks it Set a price, and your storefront shows Price coming soon with no way to buy it until it has one again.\n- It has no photo, and the table marks it Needs a photo with the suggested shot. Nothing is uploaded or linked for you.\n- Nothing is on your storefront until you set it to Active.\nA proposed product with the same name as one already in your catalog is left out.'
1160
+ text: 'On the products page, press Create with AI beside Add product (and beside Add your first product while the catalog is empty), or Propose products in Build your catalog with AI — both open the same brief. Propose products takes a brief, such as "a candle studio: hand-poured soy candles in 8 oz and 16 oz jars, and wax melts", and proposes up to twelve products, usually six or more unless your brief says how many: each with a name, type, description, tags, options, a search listing and a sentence saying what its photo should show.\nReview the table, untick any you do not want, and press Create drafts. Each product is created as a draft:\n- It starts at a placeholder price on every variant, for you to change in the product editor. You may clear a price on purpose: the product still saves, the table marks it Set a price, and your storefront shows Price coming soon with no way to buy it until it has one again.\n- It has no photo, and the table marks it Needs a photo with the suggested shot. Nothing is uploaded or linked for you.\n- Nothing is on your storefront until you set it to Active.\nA proposed product with the same name as one already in your catalog is left out.'
1161
1161
  },
1162
1162
  {
1163
1163
  path: '/ai/products-with-ai',
@@ -1276,7 +1276,7 @@ export const DOCS_SECTION_INDEX = [
1276
1276
  title: 'Start a new site with AI',
1277
1277
  heading: 'What it will cost',
1278
1278
  anchor: '#what-it-will-cost',
1279
- text: 'The bar at the bottom shows what the start can cost before you begin. On a paid plan it is an estimate. On the Free plan it is the most the start can cost, next to how many of your free credits are left this month and when they reset. If what is left cannot cover it, Plan my site is turned off and the window says so. It also tells you if one page would fit. See Before a job starts.'
1279
+ text: 'The bar at the bottom shows what the start will cost before you begin, as About N credits (up to M): about what starts like it cost on real builds, and the most it can cost. On the Free plan it also shows how many of your free credits are left this month and when they renew. If the start will likely use more than you have left, the window says so and offers Build what fits (it builds what your credits cover, then pauses until you Resume), Build the home page first (a one-page start), and Upgrade. Plan my site waits until you choose. See Before a job starts.'
1280
1280
  },
1281
1281
  {
1282
1282
  path: '/ai/start-with-ai',
@@ -1304,7 +1304,7 @@ export const DOCS_SECTION_INDEX = [
1304
1304
  title: 'Start a new site with AI',
1305
1305
  heading: 'If it does not work out',
1306
1306
  anchor: '#try-again',
1307
- text: 'If the site cannot be built, the page says Your site was not built and why.\n- Try again reopens the questions with your answers filled in, so you can adjust them and start a fresh job.\n- Use the starter site instead gives the site the starter home page. It is offered only while nothing has been built.\nWhen a job fails because of something on our side, the credits it used are given back: all of them if it built nothing, or the failed step\'s if it had already built some pages. The page says so. A job you cancel yourself is not given back. See Credits given back.'
1307
+ text: 'If the site cannot be built, the page says Your site was not built and why.\n- Try again reopens the questions with your answers filled in, so you can adjust them and start a fresh job.\n- Use the starter site instead gives the site the starter home page. It is offered only while nothing has been built.\nWhen a job fails because of something on our side, the credits it used are given back: all of them if it built nothing, or the failed step\'s if it had already built some pages. The page says so. A job you cancel yourself is not given back. See Credits given back.\nYou can also stop the build yourself with Cancel on the Building your site page. The pages it already made stay as drafts, nothing is published, and the page offers Start again and Use the starter site instead. See Cancel a job.'
1308
1308
  },
1309
1309
  {
1310
1310
  path: '/ai/start-with-ai',
@@ -1325,7 +1325,7 @@ export const DOCS_SECTION_INDEX = [
1325
1325
  title: 'Start a new site with AI',
1326
1326
  heading: 'A store from the start',
1327
1327
  anchor: '#a-store-from-the-start',
1328
- text: 'On a paid plan, a site with the Online store style also gets three to six products, each with a description and a photo, and a Cart button in the header. Each product gets a starting price of $25 so it can be bought; set its real price, and your own photo, in Products. A product without a price shows Price coming soon on the store, with no Add to cart, until you give it one. See Product copy and catalogs with AI.'
1328
+ text: 'On a paid plan, a site with the Online store style also gets three to six products, each with a description and a photo, and a Cart button in the header. Each product gets a placeholder starting price so it can be bought; set its real price, and your own photo, in Products. A product without a price shows Price coming soon on the store, with no Add to cart, until you give it one. See Product copy and catalogs with AI.'
1329
1329
  },
1330
1330
  {
1331
1331
  path: '/ai/start-with-ai',
@@ -1367,7 +1367,7 @@ export const DOCS_SECTION_INDEX = [
1367
1367
  title: 'Stock photos in AI sites',
1368
1368
  heading: 'Where the photos come from',
1369
1369
  anchor: '#where-the-photos-come-from',
1370
- text: 'Photos come from Pixabay, a library of free photos. The job searches it with words from your page, such as dog grooming salon, and picks a photo that fits the space.\nWhen no photo matches, or stock photos are not available on the deployment your workspace runs on, the space gets one of the starter photos that come with every site.'
1370
+ text: 'Photos come from Pixabay, a library of free photos. The job searches it with words from your page and your kind of business, such as ceramic serving bowl for a potter\'s work card or dog grooming salon for a groomer\'s hero, and picks a photo that fits the space.\nA picture of a thing only takes a photo that shows that thing in your line of work: a potter\'s bowl is never filled with a bowl of fruit or a bird at a feeder. When nothing shows the thing itself, the space gets a photo of your craft instead, such as handmade ceramics. One start never uses the same photo twice.\nWhen the search finds nothing at all, or stock photos are not available on the deployment your workspace runs on, the space gets one of the starter photos that come with every site.'
1371
1371
  },
1372
1372
  {
1373
1373
  path: '/ai/stock-photos',
@@ -1710,7 +1710,7 @@ export const DOCS_SECTION_INDEX = [
1710
1710
  title: 'Element catalog',
1711
1711
  heading: 'Surface',
1712
1712
  anchor: '#surface',
1713
- text: '| Element | What it\'s for |\n| Paper | A themed surface. Elevation 0–24 raises it with a shadow; the Outlined variant swaps the shadow for a border (and hides the elevation control, which does nothing there). |\n| Card | A surface for one subject, composed from Card Header (title + subheader), Card Content (the padded body) and Card Actions (the button row). Each piece is its own element, so you can select, style and reorder them. |\n| Accordion | A header that expands to reveal its details, built from Accordion Summary and Accordion Details. See Accordion below. |\nAccordion\nStart expanded controls whether visitors arrive with the panel open. On the canvas the panel is always shown open regardless — collapsed details can\'t be selected or styled. Preview and the published site both behave the way you configured it, so what ships is never in doubt.\nAccordion Summary takes an optional Header links to. Leave it empty and the whole header row toggles the panel, which is what every accordion does by default. Point it at a page and the row splits in two: the header text becomes a link to that page, and the chevron beside it becomes the toggle. That split is the only way a header can do both — a link placed inside the toggle button is invalid markup and unreachable by keyboard. It is what lets a mobile drawer offer Product both as a group to open and as a page to visit.\nThe FAQ preset drops three complete panels at once.'
1713
+ text: '| Element | What it\'s for |\n| Paper | A themed surface. Elevation 0–24 raises it with a shadow; the Outlined variant swaps the shadow for a border (and hides the elevation control, which does nothing there). |\n| Card | A surface for one subject, composed from Card Header (title + subheader), Card Content (the padded body) and Card Actions (the button row). Each piece is its own element, so you can select, style and reorder them. |\n| Accordion | A header that expands to reveal its details, built from Accordion Summary and Accordion Details. See Accordion below. |\n| Lightbox | Any elements — text, a form, a video, pictures — hidden until a button, link or picture opens them in a lightbox with a Show an element interaction. Nothing inside loads until it opens. See Lightboxes. |\nAccordion\nStart expanded controls whether visitors arrive with the panel open. On the canvas the panel is always shown open regardless — collapsed details can\'t be selected or styled. Preview and the published site both behave the way you configured it, so what ships is never in doubt.\nAccordion Summary takes an optional Header links to. Leave it empty and the whole header row toggles the panel, which is what every accordion does by default. Point it at a page and the row splits in two: the header text becomes a link to that page, and the chevron beside it becomes the toggle. That split is the only way a header can do both — a link placed inside the toggle button is invalid markup and unreachable by keyboard. It is what lets a mobile drawer offer Product both as a group to open and as a page to visit.\nThe FAQ preset drops three complete panels at once.'
1714
1714
  },
1715
1715
  {
1716
1716
  path: '/building-sites/besigner/element-catalog',
@@ -1738,7 +1738,7 @@ export const DOCS_SECTION_INDEX = [
1738
1738
  title: 'Element catalog',
1739
1739
  heading: 'Media',
1740
1740
  anchor: '#media',
1741
- text: '| Element | What it\'s for |\n| Image | An image with fit, size and radius controls, an optional link, and an automatic responsive srcSet for media-library URLs. See Image below. |\n| Video | A video file from your media library, poster first. See Video. |\n| Icon | Any icon from the icon picker. |\n| Image List / Image List Item | A dense gallery. See Image List below. |\nImage\nA picture from your media library is delivered in several widths, and each visitor\'s browser downloads the one that fits the space the image takes on their screen — a phone gets a small file, a wide desktop a larger one. You do not set anything for this.\nHow Aglyn knows how big the image shows. Every published page works it out from where the image sits, with nothing for you to do and nothing to re-save:\n- a size you gave the image itself — a pixel Width, or a pixel Height with the width left on auto (a logo set 56px tall is as wide as its picture is at that height), including different sizes per screen size;\n- the layout around it — a Grid cell set to xs:12 md:4 is a third of the page from tablet width up, an image in a grid of three equal columns is a third, the gaps between them come off, and a Container stops the slot growing past its max width.\nOn top of that, the Besigner measures how wide each image renders at the screen size you are looking at, and saving or publishing the page stores it with the image — which covers layouts the rules above cannot read. Check the page on another device in the preview switcher (XS - Mobile, MD, LG…) before you save and that size is measured too. Only when nothing at all is known does the browser assume the image is as wide as the screen.\nThe first image of the page itself — not the logo in your header — is treated as the page\'s main picture: it starts loading w'
1741
+ text: '| Element | What it\'s for |\n| Image | An image with fit, size and radius controls, an optional link, and an automatic responsive srcSet for media-library URLs. Open in a lightbox shows it full size when pressed. See Image below. |\n| Video | A video file from your media library, poster first. See Video. |\n| Music player | Your own tracks from your media library, one or a playlist of Track elements. See Music player. |\n| Icon | Any icon from the icon picker. |\n| Image List / Image List Item | A dense gallery. See Image List below. |\nImage\nA picture from your media library is delivered in several widths, and each visitor\'s browser downloads the one that fits the space the image takes on their screen — a phone gets a small file, a wide desktop a larger one. You do not set anything for this.\nHow Aglyn knows how big the image shows. Every published page works it out from where the image sits, with nothing for you to do and nothing to re-save:\n- a size you gave the image itself — a pixel Width, or a pixel Height with the width left on auto (a logo set 56px tall is as wide as its picture is at that height), including different sizes per screen size;\n- the layout around it — a Grid cell set to xs:12 md:4 is a third of the page from tablet width up, an image in a grid of three equal columns is a third, the gaps between them come off, and a Container stops the slot growing past its max width.\nOn top of that, the Besigner measures how wide each image renders at the screen size you are looking at, and saving or publishing the page stores it with the image — which covers layouts the rules above cannot read. Check the page on another device in the preview switcher (XS - Mobile, MD, LG…) before you save and that size is measured too. Only when nothing at all is known does the browser a'
1742
1742
  },
1743
1743
  {
1744
1744
  path: '/building-sites/besigner/element-catalog',
@@ -1773,7 +1773,7 @@ export const DOCS_SECTION_INDEX = [
1773
1773
  title: 'Element catalog',
1774
1774
  heading: 'Related',
1775
1775
  anchor: '#related',
1776
- text: '- The Besigner\n- Video — posters, preload, captions and the lightbox\n- Drag-and-drop hierarchy — which elements accept which children\n- Long documents in markdown — the Markdown and Table of contents elements\n- Responsive styling\n- Interactions & custom HTML'
1776
+ text: '- The Besigner\n- Video — posters, preload, captions and the lightbox\n- Music player — tracks, playlists, rights confirmation and takedowns\n- Drag-and-drop hierarchy — which elements accept which children\n- Long documents in markdown — the Markdown and Table of contents elements\n- Responsive styling\n- Interactions & custom HTML'
1777
1777
  },
1778
1778
  {
1779
1779
  path: '/building-sites/besigner/interactions-and-custom-html',
@@ -1824,6 +1824,13 @@ export const DOCS_SECTION_INDEX = [
1824
1824
  anchor: '#play-video-step',
1825
1825
  text: 'When clicked → Play a video does exactly what pressing a Video element\'s poster does, from a button anywhere on the page. Pick the Video as the target.\n- With Open in a lightbox on, the lightbox opens and the film plays.\n- With it off, the film plays in place of the poster.\nNothing is loaded from the video\'s host until the action runs, and a Wistia video follows the same consent rules as a press on its poster. To be sure the film is in view as it starts, put Scroll to element, picking the same Video, before it.'
1826
1826
  },
1827
+ {
1828
+ path: '/building-sites/besigner/interactions-and-custom-html',
1829
+ title: 'Interactions & custom HTML',
1830
+ heading: 'Open a lightbox',
1831
+ anchor: '#open-a-lightbox',
1832
+ text: 'A Lightbox element answers the visibility steps you already use: When clicked → Show an element with the Lightbox as its target opens it, from a button, a link, a picture or anything else with an interaction. Show/hide an element toggles it, and Hide an element — on a button inside the Lightbox, say — closes it. They run on every plan, like the other visibility steps.\nThe visitor can also close it with its close button, Esc and a click on the backdrop, unless you turned those off in its settings; either way the keyboard goes back to whatever opened it.\nPictures need no interaction: an Image or an Image List with Open in a lightbox on opens its own. See Lightboxes.'
1833
+ },
1827
1834
  {
1828
1835
  path: '/building-sites/besigner/interactions-and-custom-html',
1829
1836
  title: 'Interactions & custom HTML',
@@ -1845,6 +1852,69 @@ export const DOCS_SECTION_INDEX = [
1845
1852
  anchor: '#related',
1846
1853
  text: '- Walkthrough: build a mega menu with hover interactions\n- Menus & navigation\n- Besigner overview\n- Workflows & actions'
1847
1854
  },
1855
+ {
1856
+ path: '/building-sites/besigner/lightbox',
1857
+ title: 'Lightboxes',
1858
+ heading: '',
1859
+ anchor: '',
1860
+ text: 'Lightboxes\nA lightbox shows something large over the page, on a dimmed backdrop, until the visitor closes it. Aglyn has one lightbox, and four ways to open it:\n- an Image with Open in a lightbox on shows its picture full size;\n- an Image List with Open in a lightbox on opens a gallery of every picture in it;\n- Images that share a Gallery name open as one gallery, wherever they are on the page;\n- a Lightbox element holds any elements you like and opens from any button, link or picture.\nThe Video element opens the same lightbox for its film.'
1861
+ },
1862
+ {
1863
+ path: '/building-sites/besigner/lightbox',
1864
+ title: 'Lightboxes',
1865
+ heading: 'A picture, full size',
1866
+ anchor: '#image-lightbox',
1867
+ text: 'Select an Image and turn on Open in a lightbox. Pressing the picture — or focusing it and pressing Enter — opens it full size. The lightbox asks the media library for the largest version that fits the visitor\'s screen, so a small thumbnail on the page still opens sharp.\n- Lightbox caption — a line under the picture in the lightbox.\n- Gallery name — give several Images the same name and they open as one gallery, with previous and next. Leave it empty to open the picture alone.\n- Gallery thumbnails — a strip of small pictures under a gallery\'s picture.\nThe Alt text is what a screen reader reads for the picture in the lightbox too. A Decorative image is announced as "Open picture".\nAn Image that links somewhere — Link to page or External URL — follows its link instead. One press cannot both go somewhere and open a lightbox.'
1868
+ },
1869
+ {
1870
+ path: '/building-sites/besigner/lightbox',
1871
+ title: 'Lightboxes',
1872
+ heading: 'A gallery',
1873
+ anchor: '#image-list-gallery',
1874
+ text: 'Select an Image List and turn on Open in a lightbox. Pressing any picture opens a gallery of every picture in the list, starting at the one pressed:\n- Previous and Next buttons, which wrap around at the ends;\n- the arrow keys, and Home and End for the first and the last picture;\n- a sideways swipe on a phone;\n- a counter, such as 3 / 12;\n- each tile\'s Caption under its picture, or the picture\'s own Lightbox caption;\n- Gallery thumbnails, when you turn them on.'
1875
+ },
1876
+ {
1877
+ path: '/building-sites/besigner/lightbox',
1878
+ title: 'Lightboxes',
1879
+ heading: 'A lightbox of your own',
1880
+ anchor: '#lightbox-element',
1881
+ text: 'The Lightbox element (Surface group) is a container: drop any elements in it — text, a form, a video, pictures, buttons. It is hidden on the published page until something opens it.\nTo open it, give a button, link or picture an interaction: When clicked → Show an element, and pick the Lightbox as the target. Show/hide an element toggles it, and Hide an element on a button inside it closes it — a Done button, say. See Interactions.\n- Accessible name — what a screen reader announces when it opens, such as Book a call. The close button is named after it.\nOn the canvas the Lightbox is a small chip. Select it, or anything inside it, and it opens over the design surface at its real size, so you design its contents as visitors will see them.'
1882
+ },
1883
+ {
1884
+ path: '/building-sites/besigner/lightbox',
1885
+ title: 'Lightboxes',
1886
+ heading: 'How a lightbox looks and closes',
1887
+ anchor: '#lightbox-settings',
1888
+ text: 'Every element that opens a lightbox has the same settings, shown once its lightbox is on:\n| Setting | What it does |\n| Lightbox backdrop color | The color behind the lightbox. Empty keeps the dark backdrop. |\n| Lightbox backdrop opacity | 0 (clear) to 100 (solid). |\n| Lightbox backdrop blur | Blurs the page behind, in pixels. |\n| Lightbox max width / max height | The largest the lightbox frame grows, such as 1200px or 90vh. |\n| Lightbox padding | Space inside the frame. |\n| Lightbox corner radius | Rounds the frame\'s corners, in pixels. |\n| Lightbox close button | An icon, an icon on a circle, or the word Close. |\n| Lightbox close position | The frame\'s top right or top left, or the screen\'s top right. |\n| Lightbox caption | Below the picture, over the foot of it, or hidden. |\n| Lightbox transition | Fade, zoom or none. |\n| Close on backdrop click | On by default. |\n| Close on Escape | On by default. |\nInside a reusable component, every one of these can be bound to one of the component\'s properties, the way the Video\'s Open in a lightbox can — so each place the component goes can choose, for instance, whether its picture opens large.'
1889
+ },
1890
+ {
1891
+ path: '/building-sites/besigner/lightbox',
1892
+ title: 'Lightboxes',
1893
+ heading: 'For every visitor',
1894
+ anchor: '#lightbox-accessibility',
1895
+ text: '- The lightbox is announced as a dialog, by name, and the rest of the page is set aside for screen readers while it is open.\n- The keyboard stays inside it until it closes, and returns to whatever opened it.\n- Esc closes it, unless you turned Close on Escape off.\n- A visitor who asks their device for reduced motion gets no transition, whatever you chose.'
1896
+ },
1897
+ {
1898
+ path: '/building-sites/besigner/lightbox',
1899
+ title: 'Lightboxes',
1900
+ heading: 'What it costs a page',
1901
+ anchor: '#lightbox-performance',
1902
+ text: 'Nothing until it opens. The lightbox\'s own code is fetched the first time a visitor points at or presses something that opens one. A gallery\'s full-size pictures are fetched when they are shown, not before. The contents of a Lightbox element are not in the page at all until it opens — a video or a form inside one makes no request until then. That also means search engines do not read what is inside a Lightbox element; keep anything a page needs to rank for on the page itself.'
1903
+ },
1904
+ {
1905
+ path: '/building-sites/besigner/lightbox',
1906
+ title: 'Lightboxes',
1907
+ heading: 'Sites Aglyn AI builds',
1908
+ anchor: '#lightbox-ai',
1909
+ text: 'A portfolio or photography site that Aglyn AI builds opens its galleries in a lightbox: the pictures of each gallery section are one gallery, named for the section, with each item\'s title as its caption. On any site, Aglyn AI can ask for a single picture to open large. You can turn either off on the Image afterwards.'
1910
+ },
1911
+ {
1912
+ path: '/building-sites/besigner/lightbox',
1913
+ title: 'Lightboxes',
1914
+ heading: 'Related',
1915
+ anchor: '#related',
1916
+ text: '- Video — the film\'s lightbox and its controls.\n- Interactions & custom HTML — opening a Lightbox from anything.\n- Element catalog — the Image, the Image List and the Lightbox.'
1917
+ },
1848
1918
  {
1849
1919
  path: '/building-sites/besigner/live-co-editing',
1850
1920
  title: 'Live co-editing & unsaved work',
@@ -1999,6 +2069,41 @@ export const DOCS_SECTION_INDEX = [
1999
2069
  anchor: '#related',
2000
2070
  text: '- Drag-and-drop hierarchy\n- The Besigner\n- The inspector'
2001
2071
  },
2072
+ {
2073
+ path: '/building-sites/besigner/music-player',
2074
+ title: 'Music player',
2075
+ heading: '',
2076
+ anchor: '',
2077
+ text: 'Music player\nThe Music player element plays your own music on your site: one track, or a playlist of Track elements. It plays audio from your media library, with its own controls — play and pause, previous and next for a playlist, a seek bar with the time, and volume — that work with a keyboard and a screen reader.'
2078
+ },
2079
+ {
2080
+ path: '/building-sites/besigner/music-player',
2081
+ title: 'Music player',
2082
+ heading: 'Adding tracks',
2083
+ anchor: '#adding-tracks',
2084
+ text: '1. Upload your audio to the media library. MP3, M4A, AAC, OGG and WAV files are accepted.\n2. Add a Music player to the page. A new player shows add your tracks in the Besigner and nothing on the published page until it has one.\n3. Choose its Audio with Browse media, which lists only audio files, and fill in the Track title, the Artist and, if you like, the Cover art.\n4. For a playlist, use the Music playlist preset, or add Track elements inside the player. They play in the order the page shows them, and each one plays when a visitor presses it.\nA player can also play a track from an https: address somewhere else, but only once you switch on I own this audio or have a license to use it on my site for that track. Until then the published player says the track is unavailable.\nPlan availability Audio uploads are file uploads, so they follow the same plan as video and document uploads, and they count toward your media storage.'
2085
+ },
2086
+ {
2087
+ path: '/building-sites/besigner/music-player',
2088
+ title: 'Music player',
2089
+ heading: 'Your rights to the music',
2090
+ anchor: '#rights',
2091
+ text: 'Only put music on your site that you made, or that you have a license to publish. A song by another artist cannot be played on your site without the rights holder\'s permission, however it reaches the page.\n- Every audio upload asks first. Before an audio file is uploaded — and before one replaces another — the media library asks you to confirm that you own it or have a license to use it on your site. The file is not sent until you do. Your answer is stored with the file, with who gave it and when. The REST API asks the same question: an audio upload to POST /v1/media needs "rightsConfirmed": true.\n- External addresses need the same answer, given on the track itself.\n- No download button. The player has no download control and does not offer the browser\'s save menu on its audio.\n- Aglyn AI never adds music. Assist and AI site jobs place an empty player for you to fill with your own uploads. They do not find, link or embed recordings, and Assist declines a request for a named artist\'s songs.'
2092
+ },
2093
+ {
2094
+ path: '/building-sites/besigner/music-player',
2095
+ title: 'Music player',
2096
+ heading: 'Copyright takedowns',
2097
+ anchor: '#takedowns',
2098
+ text: 'When a rights holder reports a track, Aglyn takes the file down. It stays in your media library, but it stops being served everywhere it is used: a Music player shows This track is unavailable, and your media library shows the notice. A takedown is reversible, and a file that was taken down by mistake is restored.\nRights holders send notices, and site owners send counter-notices, through the copyright (DMCA) page. Repeated infringement can close an account under the Acceptable Use Policy.'
2099
+ },
2100
+ {
2101
+ path: '/building-sites/besigner/music-player',
2102
+ title: 'Music player',
2103
+ heading: 'Related',
2104
+ anchor: '#related',
2105
+ text: '- Media Library & CDN — uploads, folders and delivery\n- Video — the Video element, for films'
2106
+ },
2002
2107
  {
2003
2108
  path: '/building-sites/besigner/overview',
2004
2109
  title: 'The Besigner',
@@ -2473,7 +2578,7 @@ export const DOCS_SECTION_INDEX = [
2473
2578
  title: 'Video',
2474
2579
  heading: 'Opening in a lightbox',
2475
2580
  anchor: '#video-lightbox',
2476
- text: 'Turn on Open in a lightbox and the poster becomes a play button that opens the film full size over the page, with a close button and Esc to dismiss. It needs a poster; without one the player stays in the page as usual.\nThe lightbox has its own player controls: play, a seek bar with the time, mute and volume, captions when the video has a captions file, and full screen. Each one works from the keyboard. Space or K plays and pauses, the left and right arrows skip five seconds, M mutes, F goes full screen, and Esc closes the lightbox from any control, leaving full screen first if it is on.'
2581
+ text: 'Turn on Open in a lightbox and the poster becomes a play button that opens the film full size over the page, with a close button and Esc to dismiss. It needs a poster; without one the player stays in the page as usual.\nThe lightbox has its own player controls: play, a seek bar with the time, mute and volume, captions when the video has a captions file, and full screen. Each one works from the keyboard. Space or K plays and pauses, the left and right arrows skip five seconds, M mutes, F goes full screen, and Esc closes the lightbox from any control, leaving full screen first if it is on.\nThe lightbox\'s backdrop, size, corners, close button and transition are set with the same Lightbox settings every element has — see How a lightbox looks and closes. Left alone, the film\'s lightbox is wide and black, as it always was.'
2477
2582
  },
2478
2583
  {
2479
2584
  path: '/building-sites/besigner/video',
@@ -4211,6 +4316,97 @@ export const DOCS_SECTION_INDEX = [
4211
4316
  anchor: '#related',
4212
4317
  text: '- Sales channels\n- Commerce overview\n- SEO — products emit structured data and join the sitemap automatically.'
4213
4318
  },
4319
+ {
4320
+ path: '/commerce-and-bookings/commerce/couriers',
4321
+ title: 'Couriers for local delivery (DoorDash Drive)',
4322
+ heading: '',
4323
+ anchor: '',
4324
+ text: 'Couriers for local delivery: DoorDash Drive\nWhen you offer local delivery, your own driver takes each order out. With couriers, you can send a DoorDash courier for any local delivery instead, booked from your own DoorDash Drive account:\n- Get a quote, then send. Aglyn asks DoorDash what the delivery costs and when it would arrive. Send the courier, and DoorDash sends a Dasher to your store now.\n- Follow it on the order. The courier\'s progress, live tracking link and arrival estimate show on the order, in the Pickup & delivery queue and on your buyer\'s order status page.\n- The same statuses as your own driver. When the courier picks the order up it is Out for delivery, and when they drop it off it is Delivered, with the same emails your buyer gets for your own driver. If DoorDash cancels the courier or brings the order back, the delivery is marked Delivery failed with DoorDash\'s reason, and you can send it out again.'
4325
+ },
4326
+ {
4327
+ path: '/commerce-and-bookings/commerce/couriers',
4328
+ title: 'Couriers for local delivery (DoorDash Drive)',
4329
+ heading: 'Who pays for the courier',
4330
+ anchor: '#who-pays',
4331
+ text: 'DoorDash charges each courier to your own DoorDash Drive account, at DoorDash\'s price for that delivery. Aglyn doesn\'t charge, collect or mark up the courier\'s fee. Your buyers still pay the delivery fee of your delivery zone at checkout, as they do now.'
4332
+ },
4333
+ {
4334
+ path: '/commerce-and-bookings/commerce/couriers',
4335
+ title: 'Couriers for local delivery (DoorDash Drive)',
4336
+ heading: 'Connect DoorDash Drive',
4337
+ anchor: '#connect-doordash-drive',
4338
+ text: '1. Sign up for a DoorDash developer account at developer.doordash.com, and create an access key. A test key reaches DoorDash\'s sandbox, where no Dasher is sent; a live key, available once DoorDash has approved your account for production, sends real couriers.\n2. In Aglyn, open your store\'s Settings and find the Couriers card.\n3. Enter your key\'s Developer ID, Key ID and Signing secret — your live key, your test key, or both — and choose Connect DoorDash. Aglyn checks each key with DoorDash before saving it, and keeps the signing secret encrypted.\n4. Under At the store, enter the phone number couriers call when the location your deliveries leave from has none, and a note every courier gets ("Ask at the counter for the order number").\nOrders paid in test mode use your test key, and other orders your live key, so a test order never sends a real courier.\nGet delivery updates as they happen {#webhook}\nThe Couriers card shows a webhook address and, once, a webhook token. In the DoorDash developer portal, add a webhook with that address, set its Authorization type to Basic, and paste the token. DoorDash then tells Aglyn each step of every delivery as it happens.\nWithout the webhook, Aglyn checks every open delivery with DoorDash every 15 minutes, and when you open the order. Lost the token? Choose New webhook token and paste the new one in DoorDash.'
4339
+ },
4340
+ {
4341
+ path: '/commerce-and-bookings/commerce/couriers',
4342
+ title: 'Couriers for local delivery (DoorDash Drive)',
4343
+ heading: 'Send a courier',
4344
+ anchor: '#send-a-courier',
4345
+ text: '1. On the Orders page, in the Pickup & delivery card, choose Send a courier on a local delivery\'s row — or open the order and find its Courier section.\n2. Choose Get a DoorDash quote. Aglyn shows DoorDash\'s price and arrival estimate. The price is good for five minutes.\n3. Choose Send courier.\nA courier needs a full street address for the location your deliveries leave from (Products → Settings → Inventory locations) and the buyer\'s street address and phone number on the order. The order must be paid and not yet out for delivery or delivered.\nA delivery has one courier at a time: a second Send courier, or a retry after a lost connection, never books a second Dasher. If DoorDash doesn\'t answer, Aglyn checks with DoorDash within a few minutes and updates the order either way — don\'t book again.\nCancel a courier {#cancel}\nChoose Cancel courier on the order. The delivery stays in your own queue, where you can deliver it yourself or send another courier. DoorDash may still charge your account if the Dasher was already on the way; see DoorDash\'s cancellation terms.\nCanceling or fully refunding an order cancels its courier on Aglyn\'s next check, within 15 minutes.'
4346
+ },
4347
+ {
4348
+ path: '/commerce-and-bookings/commerce/couriers',
4349
+ title: 'Couriers for local delivery (DoorDash Drive)',
4350
+ heading: 'What your buyer sees',
4351
+ anchor: '#what-your-buyer-sees',
4352
+ text: 'While a courier is on the way, your buyer\'s order status page shows DoorDash, where the courier is, the arrival estimate and a Track your courier link to DoorDash\'s live map. The Out for delivery and Delivered emails are the ones your own driver\'s steps send.'
4353
+ },
4354
+ {
4355
+ path: '/commerce-and-bookings/commerce/fulfillment-networks',
4356
+ title: 'Fulfillment networks (ShipBob, ShipMonk and Amazon MCF)',
4357
+ heading: '',
4358
+ anchor: '',
4359
+ text: 'Fulfillment networks: ShipBob, ShipMonk and Amazon Multi-Channel Fulfillment\nIf your stock sits in a ShipMonk warehouse, connect that account to your store and Aglyn hands each paid order to it. ShipMonk is available now. ShipBob and Amazon Multi-Channel Fulfillment (FBA inventory) work the same way and appear on the card as each is set up for aglyn.com; until then the card offers only the networks you can connect. Aglyn then:\n- Paid orders go to the network. The items it stocks are sent to it to pick, pack and ship. Items it does not stock stay with you, so one order can be split between the network and your own packing table.\n- Shipments come back to the order. Each parcel the network ships is recorded on the order with its carrier and tracking number, and your customer gets the same shipped email as for a parcel you ship yourself.\n- Stock counts follow the warehouse, if you choose: the network\'s count of each SKU becomes your store\'s count.'
4360
+ },
4361
+ {
4362
+ path: '/commerce-and-bookings/commerce/fulfillment-networks',
4363
+ title: 'Fulfillment networks (ShipBob, ShipMonk and Amazon MCF)',
4364
+ heading: 'Connect a network',
4365
+ anchor: '#connect-a-network',
4366
+ text: '1. Open your store\'s Settings and find the Fulfillment networks card.\n2. Next to ShipBob or Amazon Multi-Channel Fulfillment (when the card offers them), select Connect.\n3. Sign in to that account and allow Aglyn access. You come back to the store settings with the network connected.\nYou need to be an admin of the site to connect, change or disconnect a network. Aglyn never sees your ShipBob or Amazon password; it keeps only the access the network grants, encrypted.\nShipMonk: connect with your API key\nShipMonk connects with an API key from your own ShipMonk account instead of a sign-in:\n1. In ShipMonk, open Account Settings, then Integration API Keys. If you have no API store yet, ShipMonk sets one up for you when you ask under Stores.\n2. Create an API key for your API store, and note the store\'s id shown beside it.\n3. In your store\'s Settings, select Connect ShipMonk, paste the key, enter the store id and select Connect.\nAglyn checks the key with ShipMonk before keeping it, keeps it encrypted, and never shows it again. To use a new key, revoke the old one in ShipMonk: the card asks you to Connect again, and you paste the new one.\nAfter you connect, the card shows a webhook address and a signing secret, once. Give both to ShipMonk (its webhook settings under Integrations, or ShipMonk support) so it tells Aglyn the moment an order ships. Aglyn checks every webhook\'s signature and ignores any that does not match. Without webhooks, Aglyn still reads each order back from ShipMonk every 15 minutes. New webhook secret makes a new secret and ends the old one at once.\n- ShipBob creates a channel for Aglyn in your ShipBob account. Orders appear under it.\n- Amazon asks you to choose the marketplace whose FBA inventory ships your orders, if your seller account sells in more than o'
4367
+ },
4368
+ {
4369
+ path: '/commerce-and-bookings/commerce/fulfillment-networks',
4370
+ title: 'Fulfillment networks (ShipBob, ShipMonk and Amazon MCF)',
4371
+ heading: 'Settings',
4372
+ anchor: '#settings',
4373
+ text: '| Setting | What it does |\n| Sending | Automatic sends every paid order with a shipping address. Manual sends an order only when you select Send to it on the order. |\n| Ship option (ShipBob) | The ShipBob ship option orders ask for, as named in your ShipBob account. Standard unless you change it. |\n| Shipping service (ShipMonk) | The shipping service orders ask for. It must match a shipping mapping in your ShipMonk account. Standard unless you change it. |\n| Shipping speed (Amazon) | Standard, Expedited or Priority. Amazon bills you for the speed you choose. |\n| Marketplace (Amazon) | The marketplace whose inventory ships. |\n| Keep stock counts in step | Sets your store\'s count of each SKU to what the network can ship. Off until you turn it on. |\nPause stops new orders going to the network. Orders it already has keep coming back as they ship. An order paid while a network is paused is not sent later; send it from the order if you want the network to ship it.'
4374
+ },
4375
+ {
4376
+ path: '/commerce-and-bookings/commerce/fulfillment-networks',
4377
+ title: 'Fulfillment networks (ShipBob, ShipMonk and Amazon MCF)',
4378
+ heading: 'How orders are sent',
4379
+ anchor: '#how-orders-are-sent',
4380
+ text: 'Orders are sent within about 15 minutes of being paid. When an order is sent, each item goes to the network whole if:\n- the item has a SKU that matches a product at the network,\n- the network can ship all of that item\'s units now, and\n- no one else is already shipping it, such as another network or a print-on-demand supplier.\nAnything else stays with you, and the order says why. The network ships what it took; you ship the rest, by buying a label or marking it shipped as usual. While a network holds items, buying a shipping label leaves them off, so a customer never gets the same item twice.\nNothing is sent for:\n- an order with no shipping address, such as an in-person sale or a digital order;\n- a test order, paid in test mode. A network connected to its sandbox takes only test orders;\n- an order whose address is missing a name, street, city, postal code or country (or, in the US and Canada, a state). The order says so; fix the address, then select Send to on the order.\nIf the network refuses an order, for example because it cannot ship to the address, the order shows the network\'s reason and nothing is retried. Select Send to on the order to try again once it is fixed.\nOn the order, the Fulfillment networks section shows where it stands with each network: waiting to be sent, with the network, partly or fully shipped, canceled, or not sent and why.'
4381
+ },
4382
+ {
4383
+ path: '/commerce-and-bookings/commerce/fulfillment-networks',
4384
+ title: 'Fulfillment networks (ShipBob, ShipMonk and Amazon MCF)',
4385
+ heading: 'Stock counts',
4386
+ anchor: '#stock-counts',
4387
+ text: 'With Keep stock counts in step on, Aglyn reads the network\'s count about once an hour and sets your store\'s count of each matching SKU to it. Each change appears in your products\' Stock movements as Count synced, counted by the network.\n- An order that is paid but not yet sent is taken off the count, so it is not sold twice.\n- A product that does not track stock is left alone.\n- A product that counts stock per location is left alone: one number would erase the counts you keep for each location.\n- Turn this on only for SKUs the network holds all of. If you also keep some of a SKU on your own shelf, the network\'s count replaces yours.\nThe card shows how many SKUs the network holds and how many of your counts the last sync changed. Sync now counts again straight away.'
4388
+ },
4389
+ {
4390
+ path: '/commerce-and-bookings/commerce/fulfillment-networks',
4391
+ title: 'Fulfillment networks (ShipBob, ShipMonk and Amazon MCF)',
4392
+ heading: 'Shipments and tracking',
4393
+ anchor: '#shipments-and-tracking',
4394
+ text: 'Each parcel the network ships becomes a shipment on the order, with its carrier and tracking number. When every item has shipped, the order is Fulfilled.\n- Amazon reports where each parcel is. Aglyn follows it until it is delivered or returned, for up to 30 days, and the order moves to Delivered when every parcel has arrived.\n- ShipBob tells Aglyn when a parcel is delivered or has a delivery problem, and the order shows it.\n- ShipMonk reports each package of an order, including the parts of an order it split, and where the order is. Aglyn follows it until it is delivered, for up to 30 days. If ShipMonk holds an order, for example on backorder or because it needs an address fixed, the order says so.'
4395
+ },
4396
+ {
4397
+ path: '/commerce-and-bookings/commerce/fulfillment-networks',
4398
+ title: 'Fulfillment networks (ShipBob, ShipMonk and Amazon MCF)',
4399
+ heading: 'Canceling and refunds',
4400
+ anchor: '#canceling-and-refunds',
4401
+ text: 'When you cancel an order, or refund it in full, Aglyn asks the network to cancel it. You can also select Cancel at a network on the order. Once the network has started packing, it may be too late: the order says so, and anything that ships still comes back to the order. ShipMonk\'s warehouse may confirm a cancellation later; the order says it was requested until it does.\nA partial refund does not cancel anything at the network. If it covered items the network still holds, the order tells you, so you can cancel them in the network\'s own account if they should not ship.'
4402
+ },
4403
+ {
4404
+ path: '/commerce-and-bookings/commerce/fulfillment-networks',
4405
+ title: 'Fulfillment networks (ShipBob, ShipMonk and Amazon MCF)',
4406
+ heading: 'Activity',
4407
+ anchor: '#activity',
4408
+ text: 'Each connected network has an activity list on the card: orders sent, parcels shipped, cancellations, stock syncs and errors, newest first.\nIf a network stops accepting the connection, for example after you remove Aglyn\'s access there, the card asks you to Connect again. Orders paid in the meantime wait and are sent once you reconnect.\nDisconnect stops sending orders and removes the stored access. Orders the network already holds are left with it: check them in the network\'s own account, and ship anything it has not shipped another way.'
4409
+ },
4214
4410
  {
4215
4411
  path: '/commerce-and-bookings/commerce/order-notifications',
4216
4412
  title: 'Order emails & status page',
@@ -4650,14 +4846,14 @@ export const DOCS_SECTION_INDEX = [
4650
4846
  title: 'Review platforms (Trustpilot and Yotpo)',
4651
4847
  heading: 'Trustpilot',
4652
4848
  anchor: '#trustpilot',
4653
- text: 'Invite customers to review your store on Trustpilot after their order ships or arrives, by copying one order email to your Trustpilot invitation address.\nGo to Commerce → Settings and find the Trustpilot card. Under How Trustpilot hears about orders, choose one way, and under When to invite, choose:\n- When the order ships, goes out for delivery or is picked up, or\n- When the order is delivered or picked up.\nTrustpilot\'s own delay setting still applies after that.\nBy your invitation address {#trustpilot-invitation-address}\nTrustpilot gives every business an Automatic Feedback Service address that ends in @invite.trustpilot.com. No key is needed:\n1. Copy that address from your Trustpilot Business account.\n2. On the Trustpilot card, choose Copy an order email to my Trustpilot invitation address and paste it in Trustpilot invitation address. Only an address on invite.trustpilot.com is accepted.\n3. Select Save in the card\'s header.\nThe customer\'s Order shipped, Order out for delivery, Order picked up or Order delivered email (whichever comes first at the moment you chose) is then blind-copied to Trustpilot, with the customer\'s name, email and order number in a part of the email only Trustpilot reads. The customer does not see the copy. If you turn that email off under Order notifications, no copy is sent.\nBy your Trustpilot API key {#trustpilot-api}\nRolling out The API option is not yet available on aglyn.com-hosted workspaces. Until it is, the card offers the invitation address only.\nIf your Trustpilot plan includes API access, you can send invitations through it instead:\n1. In Trustpilot Business, under Integrations → Developers → APIs, create or copy an API key and secret.\n2. On the Trustpilot card, choose Trustpilot API, with my API key, and paste the API key, API secret'
4849
+ text: 'Invite customers to review your store on Trustpilot after their order ships or arrives, by copying one order email to your Trustpilot invitation address.\nGo to Commerce → Settings and find the Trustpilot card. Under How Trustpilot hears about orders, choose one way, and under When to invite, choose:\n- When the order ships, goes out for delivery or is picked up, or\n- When the order is delivered or picked up.\nTrustpilot\'s own delay setting still applies after that.\nBy your invitation address {#trustpilot-invitation-address}\nTrustpilot gives every business an Automatic Feedback Service address that ends in @invite.trustpilot.com. No key is needed:\n1. Copy that address from your Trustpilot Business account.\n2. On the Trustpilot card, choose Copy an order email to my Trustpilot invitation address and paste it in Trustpilot invitation address. Only an address on invite.trustpilot.com is accepted.\n3. Select Save in the card\'s header.\nThe customer\'s Order shipped, Order out for delivery, Order picked up or Order delivered email (whichever comes first at the moment you chose) is then blind-copied to Trustpilot, with the customer\'s name, email and order number in a part of the email only Trustpilot reads. The customer does not see the copy. If you turn that email off under Order notifications, no copy is sent.\nBy your Trustpilot API key {#trustpilot-api}\nIf your Trustpilot plan includes API access, you can send invitations through it instead:\n1. In Trustpilot Business, under Integrations → Developers → APIs, create or copy an API key and secret.\n2. On the Trustpilot card, choose Trustpilot API, with my API key, and paste the API key, API secret and your Business unit ID. Add your Business user ID, a Language such as en-US, and an Invitation template ID if you use them.\n3. Select '
4654
4850
  },
4655
4851
  {
4656
4852
  path: '/commerce-and-bookings/commerce/review-platforms',
4657
4853
  title: 'Review platforms (Trustpilot and Yotpo)',
4658
4854
  heading: 'Yotpo Reviews',
4659
4855
  anchor: '#yotpo-reviews',
4660
- text: 'Send each shipped order to your Yotpo Reviews account, so Yotpo asks the customer for a review.\nRolling out Yotpo Reviews is not yet available on aglyn.com-hosted workspaces. Until it is, no Yotpo Reviews card appears.\n1. In your Yotpo Reviews settings, copy the app key and secret key. These are not the keys of Yotpo Loyalty & Referrals, which connects under Rewards.\n2. On the Yotpo Reviews card under Commerce → Settings, paste both, turn on Send shipped orders to Yotpo for review requests, and select Save.\nWhen an order first ships or is picked up, Aglyn sends it to Yotpo with its items, marked fulfilled, and Yotpo sends the customer its review request after the delay set in your Yotpo account.'
4856
+ text: 'Send each shipped order to your Yotpo Reviews account, so Yotpo asks the customer for a review.\n1. In your Yotpo Reviews settings, copy the app key and secret key. These are not the keys of Yotpo Loyalty & Referrals, which connects under Rewards.\n2. On the Yotpo Reviews card under Commerce → Settings, paste both, turn on Send shipped orders to Yotpo for review requests, and select Save.\nWhen an order first ships or is picked up, Aglyn sends it to Yotpo with its items, marked fulfilled, and Yotpo sends the customer its review request after the delay set in your Yotpo account.'
4661
4857
  },
4662
4858
  {
4663
4859
  path: '/commerce-and-bookings/commerce/review-platforms',
@@ -6918,7 +7114,7 @@ export const DOCS_SECTION_INDEX = [
6918
7114
  title: 'Media Library & CDN',
6919
7115
  heading: 'Upload',
6920
7116
  anchor: '#upload',
6921
- text: '- Upload images, PDFs, ZIP archives and documents (Word, Excel, PowerPoint, CSV, RTF, plain text, Markdown and JSON). Click Upload media, or drag files straight from your desktop onto the library — dropped files land in the folder you have open.\n- Video uploads are paused. New MP4, WebM and QuickTime files are not accepted on any plan for now, from the console or the API, and a video\'s file cannot be replaced. Videos already in your library keep playing, and the Video element can still use them. While the pause lasts, the library shows a Video uploads paused chip beside Upload media.\n- Create images with AI. Create with AI, beside Upload media, draws an illustration, icon, pattern or logo mark as an SVG from a description, or, where photos are on, makes a photo, a piece of art such as a watercolor or a 3D render, or a design asset such as a banner or a social post graphic, and adds it to the folder you have open with alt text. Each picture is stored like an upload and costs AI credits — see Create images with AI.\n- Web fonts (WOFF2) are accepted too. The usual way to add one is Upload your own font in the theme editor, which checks the font\'s license, converts a TTF, OTF or WOFF to WOFF2 and stores it here.\n- Documents and archives are stored and served exactly as you uploaded them — nothing is opened, extracted or converted. Macro-enabled Office files (.docm, .xlsm, .pptm) are not accepted.\n- Rename, replace the file behind an asset, and edit images in place. Replace works for images, PDFs, archives and documents alike, and for video once video uploads resume — it is available from the asset\'s details drawer and straight from the card\'s overflow menu, and it keeps the asset\'s link, folder, tags, alt text, custom fields and sharing exactly as they were. Swapping one kin'
7117
+ text: '- Upload images, PDFs, ZIP archives and documents (Word, Excel, PowerPoint, CSV, RTF, plain text, Markdown and JSON). Click Upload media, or drag files straight from your desktop onto the library — dropped files land in the folder you have open.\n- Video uploads are paused. New MP4, WebM and QuickTime files are not accepted on any plan for now, from the console or the API, and a video\'s file cannot be replaced. Videos already in your library keep playing, and the Video element can still use them. While the pause lasts, the library shows a Video uploads paused chip beside Upload media.\n- Upload audio — MP3, M4A, AAC, OGG and WAV — to play your own music with the Music player. Each audio upload first asks you to confirm you own the audio or have a license to use it on your site; see Your rights to the music.\n- Create images with AI. Create with AI, beside Upload media, draws an illustration, icon, pattern or logo mark as an SVG from a description, or, where photos are on, makes a photo, a piece of art such as a watercolor or a 3D render, or a design asset such as a banner or a social post graphic, and adds it to the folder you have open with alt text. Each picture is stored like an upload and costs AI credits — see Create images with AI.\n- Web fonts (WOFF2) are accepted too. The usual way to add one is Upload your own font in the theme editor, which checks the font\'s license, converts a TTF, OTF or WOFF to WOFF2 and stores it here.\n- Documents and archives are stored and served exactly as you uploaded them — nothing is opened, extracted or converted. Macro-enabled Office files (.docm, .xlsm, .pptm) are not accepted.\n- Rename, replace the file behind an asset, and edit images in place. Replace works for images, PDFs, archives and documents alike, and for video once video up'
6922
7118
  },
6923
7119
  {
6924
7120
  path: '/content-and-data/media/overview',
@@ -8493,7 +8689,7 @@ export const DOCS_SECTION_INDEX = [
8493
8689
  title: 'Environment variables',
8494
8690
  heading: 'Scheduled jobs',
8495
8691
  anchor: '#cron',
8496
- text: 'Three separate mechanisms, and missing any of them is quiet rather than loud.\n| Variable | Need | When | Value |\n| CRONSECRET | Feature | Runtime | Shared secret every scheduled route checks, accepted as Authorization: Bearer or x-cron-secret: . Unset, every one of those routes refuses. openssl rand -hex 32. |\n| AGLYNJOBRUNNERURL | Feature (cloud functions) | Runtime | The tenant origin the every-minute beat POSTs: https://sites.example.com/api/plugins/run-jobs. No default, deliberately. |\n| AGLYNCONSOLEURL | Feature (cloud functions) | Runtime | The origin that serves your console — never one that redirects to it, because a redirect drops the POST body and the x-cron-secret header. It drives the fifteen-minute console sweeps and the every-minute AI jobs beat. No default, deliberately. |\n| CRMDIGESTTIMEZONE | Optional | Runtime | The zone /api/crm/daily-digest reads "today" in when it counts overdue and due-today tasks. Default America/Chicago, which is why the schedule below fires at 13:00 UTC; an IANA name (Europe/London). A value the runtime does not know falls back to the default with a warning. Schedule the route for 08:00 in whatever zone you set. |\nWhat CRONSECRET being unset silently switches off:\n- Scheduled campaign sends. You can schedule a campaign in the console, watch it be accepted, and watch its send time pass with nothing delivered and no error anywhere.\n- Audit archival, so the audit collection grows past its retention window and the retention promise goes quietly unkept.\n- Erasure runs, so personal data a customer asked you to delete is still there while the clock on that request runs.\n- Metered usage roll-up, so nothing is metered into Stripe and the monthly usage document is never written — which in turn means every usage budget is structurally unab'
8692
+ text: 'Three separate mechanisms, and missing any of them is quiet rather than loud.\n| Variable | Need | When | Value |\n| CRONSECRET | Feature | Runtime | Shared secret every scheduled route checks, accepted as Authorization: Bearer or x-cron-secret: . Unset, every one of those routes refuses. openssl rand -hex 32. |\n| AGLYNJOBRUNNERURL | Feature (cloud functions) | Runtime | The tenant origin the every-minute beat POSTs: https://sites.example.com/api/plugins/run-jobs. No default, deliberately. |\n| AGLYNCONSOLEURL | Feature (cloud functions) | Runtime | The origin that serves your console — never one that redirects to it, because a redirect drops the POST body and the x-cron-secret header. It drives the fifteen-minute console sweeps and the every-minute AI jobs beat. No default, deliberately. |\n| AGLYNALLOWUNCONFIGUREDFUNCTIONS | Optional | Deploy | Set to 1 to let firebase deploy --only functions proceed when no dotenv in cloud/functions sets AGLYNCONSOLEURL and AGLYNJOBRUNNERURL. Unset — the default — the predeploy check refuses, because a deploy without them replaces each function\'s env and its scheduled jobs then skip every run. Set it only for a deploy that intentionally carries no scheduled jobs. |\n| CRMDIGESTTIMEZONE | Optional | Runtime | The zone /api/crm/daily-digest reads "today" in when it counts overdue and due-today tasks. Default America/Chicago, which is why the schedule below fires at 13:00 UTC; an IANA name (Europe/London). A value the runtime does not know falls back to the default with a warning. Schedule the route for 08:00 in whatever zone you set. |\nWhat CRONSECRET being unset silently switches off:\n- Scheduled campaign sends. You can schedule a campaign in the console, watch it be accepted, and watch its send time pass with nothing delivered and no erro'
8497
8693
  },
8498
8694
  {
8499
8695
  path: '/developers/self-hosting-environment',
@@ -9697,7 +9893,35 @@ export const DOCS_SECTION_INDEX = [
9697
9893
  title: 'Ad tracking',
9698
9894
  heading: 'Related',
9699
9895
  anchor: '#related',
9700
- text: '- Cookie consent — the advertising question and the consent modes\n- Google Analytics events — the same moments, in your GA4 property'
9896
+ text: '- Server-side ad conversions — send purchases and leads from the server too\n- Cookie consent — the advertising question and the consent modes\n- Google Analytics events — the same moments, in your GA4 property'
9897
+ },
9898
+ {
9899
+ path: '/marketing-and-automation/analytics/connect-conversions-api',
9900
+ title: 'Server-side ad conversions',
9901
+ heading: '',
9902
+ anchor: '',
9903
+ text: 'Server-side ad conversions\nSend purchases and leads to Meta, TikTok and Pinterest from the server as well as from the browser tag, so a conversion is still counted when an ad blocker or a closed tab stops the tag. Everything uses your own accounts: the access tokens are yours, and what is sent goes to your ad accounts, not to Aglyn\'s.'
9904
+ },
9905
+ {
9906
+ path: '/marketing-and-automation/analytics/connect-conversions-api',
9907
+ title: 'Server-side ad conversions',
9908
+ heading: 'Connect an account',
9909
+ anchor: '#conversions-api',
9910
+ text: 'Site → Setup → Ad conversions. Each vendor has its own card there. Connect it with an access token from your own account.\nMeta Conversions API {#meta-conversions-api}\nSend purchases and leads to your Meta pixel from the server, for visitors who allowed advertising, so ad blockers and closed tabs do not lose them.\n- Access token: Events Manager → your pixel → Settings → Conversions API → Generate access token.\n- Also needed: the Meta pixel ID on the Tracking tab.\nTikTok Events API {#tiktok-events-api}\nSend purchases and leads to your TikTok pixel from the server, for visitors who allowed advertising, so ad blockers and closed tabs do not lose them.\n- Access token: Ads Manager → Assets → Events → your pixel → Settings → Events API → Generate access token.\n- Also needed: the TikTok pixel ID on the Tracking tab.\nPinterest Conversions API {#pinterest-conversions-api}\nSend purchases and leads to your Pinterest ad account from the server, for visitors who allowed advertising, so ad blockers and closed tabs do not lose them.\n- Access token: Pinterest Ads → Conversions → Conversions API → Generate new token.\n- Also needed: your ad account ID.\nHow it works {#how-it-works}\nThe token is stored encrypted and is never shown again; to change it, use Replace token.\nOnce connected, your site sends from the server:\n- Purchases — every paid online order whose shopper allowed advertising when they started checkout. Orders taken at the register are not sent, and a subscription\'s first payment is reported by the browser tag only; renewals are not reported at all.\n- Leads — every form submitted by a visitor who allowed advertising.\nEach server event carries the same event ID as the browser tag\'s event for the same purchase or lead, so Meta, TikTok and Pinterest keep one and count it once. An '
9911
+ },
9912
+ {
9913
+ path: '/marketing-and-automation/analytics/connect-conversions-api',
9914
+ title: 'Server-side ad conversions',
9915
+ heading: 'Test events',
9916
+ anchor: '#test-events',
9917
+ text: '- Meta and TikTok: paste the test event code from the vendor\'s test events tool into the card. Send test event sends one test Purchase with it, and orders paid in Stripe\'s test mode are sent with it too. Real orders never carry it. Without a code, nothing from a test-mode order is sent.\n- Pinterest: test events and test-mode orders are sent with Pinterest\'s test flag, which Pinterest checks and does not record as a conversion.\nA test-mode order is never sent as a real conversion.'
9918
+ },
9919
+ {
9920
+ path: '/marketing-and-automation/analytics/connect-conversions-api',
9921
+ title: 'Server-side ad conversions',
9922
+ heading: 'Related',
9923
+ anchor: '#related',
9924
+ text: '- Ad tracking — the browser tags these events are paired with\n- Cookie consent — the advertising question both depend on'
9701
9925
  },
9702
9926
  {
9703
9927
  path: '/marketing-and-automation/analytics/cookie-consent',
@@ -11293,7 +11517,7 @@ export const DOCS_SECTION_INDEX = [
11293
11517
  title: 'Invite teammates',
11294
11518
  heading: 'A member\'s page',
11295
11519
  anchor: '#member-page',
11296
- text: 'Open anyone from the Team page to see their own page: their role and site access, a Password card for helping them back in, what has been changed about them, everything they have done in the organization, and their AI usage and allotment.\nRole and site access {#member-access}\nThe Member card sets this person\'s organization role and job title and, for an editor or viewer, which sites they can reach. Roles are Admin, Editor and Viewer. Admins reach every site; for an editor or viewer, turn off Access to all sites and choose Editor, Viewer or No access on each site, so they see only those. Save applies the change; Remove from organization takes them off the team and frees their seat.\nEditing a member needs the admin role. The owner\'s role is not edited here — ownership moves under Settings → Transfer ownership.\nOne member\'s activity {#member-activity}\nActivity by this member lists everything this person has done in the organization — on its sites as well as at organization level — newest first. Above it, Changes to this member lists what others changed about them, such as role and access edits. Both need the Activity & audit log permission, the same as the organization\'s activity log.'
11520
+ text: 'Open anyone from the Team page to see their own page: their role and site access, a Password card for helping them back in, what has been changed about them, everything they have done in the organization, and their AI usage and allotment.\nRole and site access {#member-access}\nThe Member card sets this person\'s organization role and job title and, for an editor or viewer, which sites they can reach. Roles are Admin, Editor and Viewer. Admins reach every site; for an editor or viewer, turn off Access to all sites and choose Editor, Viewer or No access on each site, so they see only those. Save applies the change; Remove from organization takes them off the team and frees their seat.\nEditing a member needs the admin role. The owner\'s role is not edited here — ownership moves under Settings → Transfer ownership.\nOne member\'s activity {#member-activity}\nActivity by this member lists everything this person has done in the organization — on its sites as well as at organization level — newest first. Above it, Changes to this member lists what others changed about them, such as role and access edits. Both need the Activity & audit log permission, the same as the organization\'s activity log.\nChanges to this member {#member-changes}\nChanges to this member lists what other people changed about this person, such as role and site-access edits, newest first, with who made each change and when. It reads the same entries as the organization\'s activity log, narrowed to the ones whose target is this member.'
11297
11521
  },
11298
11522
  {
11299
11523
  path: '/workspace-and-billing/teams-and-roles/invite-teammates',