@adia-ai/web-components 0.8.6 → 0.8.7

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 (102) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/dist/theme-provider.min.js +1 -1
  3. package/dist/web-components.min.js +1 -1
  4. package/package.json +2 -1
  5. package/patterns/access-requests/access-requests.examples.html +132 -0
  6. package/patterns/access-requests/access-requests.html +60 -0
  7. package/patterns/admin-keys-and-export/admin-keys-and-export.examples.html +236 -0
  8. package/patterns/admin-keys-and-export/admin-keys-and-export.html +64 -0
  9. package/patterns/admin-shell/admin-shell.examples.html +327 -0
  10. package/patterns/admin-shell/admin-shell.html +44 -0
  11. package/patterns/agent-cost/agent-cost.examples.html +111 -0
  12. package/patterns/agent-cost/agent-cost.html +62 -0
  13. package/patterns/agent-memory/agent-memory.examples.html +155 -0
  14. package/patterns/agent-memory/agent-memory.html +64 -0
  15. package/patterns/agent-prompt-library/agent-prompt-library.examples.html +181 -0
  16. package/patterns/agent-prompt-library/agent-prompt-library.html +64 -0
  17. package/patterns/agent-tool-call/agent-tool-call.examples.html +123 -0
  18. package/patterns/agent-tool-call/agent-tool-call.html +60 -0
  19. package/patterns/alert-dialog/alert-dialog.examples.html +105 -0
  20. package/patterns/alert-dialog/alert-dialog.html +57 -0
  21. package/patterns/app-nav/app-nav.examples.html +421 -0
  22. package/patterns/app-nav/app-nav.html +50 -0
  23. package/patterns/approvals/approvals.examples.html +131 -0
  24. package/patterns/approvals/approvals.html +58 -0
  25. package/patterns/audit-log/audit-log.examples.html +74 -0
  26. package/patterns/audit-log/audit-log.examples.js +60 -0
  27. package/patterns/audit-log/audit-log.html +63 -0
  28. package/patterns/bulk-action-toolbar/bulk-action-toolbar.examples.html +89 -0
  29. package/patterns/bulk-action-toolbar/bulk-action-toolbar.examples.js +69 -0
  30. package/patterns/bulk-action-toolbar/bulk-action-toolbar.html +62 -0
  31. package/patterns/changelog-feed/changelog-feed.examples.html +151 -0
  32. package/patterns/changelog-feed/changelog-feed.html +57 -0
  33. package/patterns/chart-in-card/chart-in-card.examples.html +193 -0
  34. package/patterns/chart-in-card/chart-in-card.examples.js +46 -0
  35. package/patterns/chart-in-card/chart-in-card.html +66 -0
  36. package/patterns/chat-shell/chat-shell.examples.html +129 -0
  37. package/patterns/chat-shell/chat-shell.html +46 -0
  38. package/patterns/comments-and-collaboration/comments-and-collaboration.examples.html +241 -0
  39. package/patterns/comments-and-collaboration/comments-and-collaboration.html +66 -0
  40. package/patterns/component-tokens/component-tokens.examples.html +483 -0
  41. package/patterns/component-tokens/component-tokens.html +42 -0
  42. package/patterns/conversion-funnel/conversion-funnel.examples.html +158 -0
  43. package/patterns/conversion-funnel/conversion-funnel.examples.js +4 -0
  44. package/patterns/conversion-funnel/conversion-funnel.html +64 -0
  45. package/patterns/data-tables-inline-edit-and-tree/data-tables-inline-edit-and-tree.examples.html +196 -0
  46. package/patterns/data-tables-inline-edit-and-tree/data-tables-inline-edit-and-tree.html +58 -0
  47. package/patterns/diff-review/diff-review.examples.html +147 -0
  48. package/patterns/diff-review/diff-review.html +56 -0
  49. package/patterns/editor-shell/editor-shell.examples.html +139 -0
  50. package/patterns/editor-shell/editor-shell.html +62 -0
  51. package/patterns/export-flow/export-flow.examples.html +152 -0
  52. package/patterns/export-flow/export-flow.examples.js +37 -0
  53. package/patterns/export-flow/export-flow.html +65 -0
  54. package/patterns/filter-bar/filter-bar.examples.html +116 -0
  55. package/patterns/filter-bar/filter-bar.examples.js +23 -0
  56. package/patterns/filter-bar/filter-bar.html +70 -0
  57. package/patterns/form-drawer/form-drawer.examples.html +210 -0
  58. package/patterns/form-drawer/form-drawer.html +64 -0
  59. package/patterns/form-system/form-system.examples.html +383 -0
  60. package/patterns/form-system/form-system.html +48 -0
  61. package/patterns/forms-conditional-and-autocomplete/forms-conditional-and-autocomplete.examples.html +189 -0
  62. package/patterns/forms-conditional-and-autocomplete/forms-conditional-and-autocomplete.html +64 -0
  63. package/patterns/inline-dialog/inline-dialog.examples.html +143 -0
  64. package/patterns/inline-dialog/inline-dialog.html +59 -0
  65. package/patterns/kanban-board/kanban-board.examples.html +224 -0
  66. package/patterns/kanban-board/kanban-board.html +58 -0
  67. package/patterns/layout/layout.examples.html +365 -0
  68. package/patterns/layout/layout.html +54 -0
  69. package/patterns/marketing-engagement/marketing-engagement.examples.html +280 -0
  70. package/patterns/marketing-engagement/marketing-engagement.html +64 -0
  71. package/patterns/notifications-bell-and-digest/notifications-bell-and-digest.examples.html +213 -0
  72. package/patterns/notifications-bell-and-digest/notifications-bell-and-digest.html +58 -0
  73. package/patterns/overview/overview.examples.html +119 -0
  74. package/patterns/overview/overview.html +42 -0
  75. package/patterns/permissions-matrix/permissions-matrix.examples.html +91 -0
  76. package/patterns/permissions-matrix/permissions-matrix.examples.js +28 -0
  77. package/patterns/permissions-matrix/permissions-matrix.html +56 -0
  78. package/patterns/permissions-role-picker/permissions-role-picker.examples.html +81 -0
  79. package/patterns/permissions-role-picker/permissions-role-picker.html +56 -0
  80. package/patterns/permissions-sharing/permissions-sharing.examples.html +175 -0
  81. package/patterns/permissions-sharing/permissions-sharing.html +66 -0
  82. package/patterns/profile-public-and-verification/profile-public-and-verification.examples.html +227 -0
  83. package/patterns/profile-public-and-verification/profile-public-and-verification.html +70 -0
  84. package/patterns/record-detail-drawer/record-detail-drawer.examples.html +164 -0
  85. package/patterns/record-detail-drawer/record-detail-drawer.html +64 -0
  86. package/patterns/responsive-shell-sidebar/README.md +37 -0
  87. package/patterns/responsive-shell-sidebar/responsive-shell-sidebar.css +39 -0
  88. package/patterns/responsive-shell-sidebar/responsive-shell-sidebar.examples.html +208 -0
  89. package/patterns/responsive-shell-sidebar/responsive-shell-sidebar.html +47 -0
  90. package/patterns/retention-cohort/retention-cohort.examples.html +149 -0
  91. package/patterns/retention-cohort/retention-cohort.examples.js +37 -0
  92. package/patterns/retention-cohort/retention-cohort.html +62 -0
  93. package/patterns/search-discovery/search-discovery.examples.html +263 -0
  94. package/patterns/search-discovery/search-discovery.html +58 -0
  95. package/patterns/system-banners/system-banners.examples.html +150 -0
  96. package/patterns/system-banners/system-banners.html +52 -0
  97. package/patterns/timezone-selector/timezone-selector.examples.html +82 -0
  98. package/patterns/timezone-selector/timezone-selector.examples.js +72 -0
  99. package/patterns/timezone-selector/timezone-selector.html +57 -0
  100. package/patterns/wizard-drawer/wizard-drawer.examples.html +144 -0
  101. package/patterns/wizard-drawer/wizard-drawer.examples.js +33 -0
  102. package/patterns/wizard-drawer/wizard-drawer.html +72 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Changelog — @adia-ai/web-components
2
2
 
3
+ ## [0.8.7] — 2026-07-19
4
+
5
+ ### Changed
6
+ - **`dist/theme-provider.min.js`, `dist/web-components.min.js` rebuilt** (`npm run build:bundle-js`) — both had drifted stale relative to source; regenerated as part of 0.8.7 release pre-flight. No source change; `patterns/` also joins the package's published `files` (see `package.json`) so a consumer install resolves pattern source from `node_modules` (`adia-patterns` skill, `adia-ui-factory` `CHANGELOG.md`).
7
+
3
8
  ## [0.8.6] — 2026-07-18
4
9
 
5
10
  ### Fixed
@@ -1,4 +1,4 @@
1
- var pa=Object.defineProperty;var E=(a,r)=>()=>(a&&(r=a(a=0)),r);var O=(a,r)=>{for(var e in r)pa(a,e,{get:r[e],enumerable:!0})};var V={};O(V,{constructSheet:()=>G,default:()=>ha});function G(){return typeof CSSStyleSheet>"u"?null:(w||(w=new CSSStyleSheet,w.replaceSync(ua)),w)}var ua,w,ha,D=E(()=>{"use strict";ua="@layer context{[data-scheme=light]{color-scheme:light}[data-scheme=dark]{color-scheme:dark}[data-scheme=system]{color-scheme:light dark}[theme=default]{--a-neutral-hue:225;--a-neutral-c-min:.01;--a-brand-hue:225;--a-primary-hue:225;--a-success-hue:145;--a-warning-hue:65;--a-danger-hue:25;--a-info-hue:200;--a-radius-k:1;--a-density:1;--a-shadow-intensity:1}[theme=ocean]{--a-neutral-hue:210;--a-neutral-c-min:.02;--a-brand-hue:200;--a-primary-hue:200;--a-success-hue:160;--a-warning-hue:55;--a-danger-hue:15;--a-info-hue:190;--a-primary-c-max:.2;--a-brand-c-max:.2;--a-radius-k:1.5;--a-density:1.1}[theme=forest]{--a-neutral-hue:150;--a-neutral-c-min:.018;--a-neutral-c-max:.03;--a-brand-hue:140;--a-primary-hue:140;--a-success-hue:145;--a-warning-hue:60;--a-danger-hue:20;--a-info-hue:180;--a-primary-c-max:.14;--a-brand-c-max:.14;--a-radius-k:.5;--a-density:.9}[theme=sunset]{--a-neutral-hue:30;--a-neutral-c-min:.022;--a-brand-hue:20;--a-primary-hue:20;--a-success-hue:145;--a-warning-hue:50;--a-danger-hue:10;--a-info-hue:200;--a-primary-c-max:.22;--a-brand-c-max:.22;--a-radius-k:.25;--a-density:1.1}[theme=lavender]{--a-neutral-hue:280;--a-neutral-c-min:.018;--a-brand-hue:270;--a-primary-hue:270;--a-success-hue:145;--a-warning-hue:65;--a-danger-hue:25;--a-info-hue:220;--a-primary-c-max:.15;--a-brand-c-max:.15;--a-radius-k:2;--a-density:1.1}[theme=rose]{--a-neutral-hue:350;--a-neutral-c-min:.016;--a-brand-hue:340;--a-primary-hue:340;--a-success-hue:145;--a-warning-hue:55;--a-danger-hue:15;--a-info-hue:200;--a-primary-c-max:.17;--a-brand-c-max:.17;--a-radius-k:.75;--a-density:1}[theme=slate]{--a-neutral-hue:220;--a-neutral-c-min:.008;--a-neutral-c-max:.015;--a-brand-hue:220;--a-primary-hue:220;--a-success-hue:145;--a-warning-hue:65;--a-danger-hue:25;--a-info-hue:200;--a-primary-c-max:.1;--a-brand-c-max:.1;--a-radius-k:.35;--a-density:.85;--a-shadow-intensity:.5}[theme=midnight]{--a-neutral-hue:250;--a-neutral-c-min:.02;--a-brand-hue:240;--a-primary-hue:240;--a-success-hue:150;--a-warning-hue:60;--a-danger-hue:20;--a-info-hue:210;--a-primary-c-max:.22;--a-brand-c-max:.22;--a-radius-k:1.25;--a-density:1.1}}",w=null;ha=G});var U={};O(U,{constructSheet:()=>W,default:()=>ba});function W(){return typeof CSSStyleSheet>"u"?null:(z||(z=new CSSStyleSheet,z.replaceSync(fa)),z)}var fa,z,ba,K=E(()=>{"use strict";fa="@layer context{[verse]{--a-inset-sm:var(--a-space-2-5);--a-inset-md:var(--a-space-3);--a-inset-lg:var(--a-space-3-5);--a-inset:var(--a-inset-md);--a-gap-xs:calc(var(--a-space-2) * var(--a-gap-k));--a-gap-sm:calc(var(--a-space-2-5) * var(--a-gap-k));--a-gap-md:calc(var(--a-space-3) * var(--a-gap-k));--a-gap-lg:calc(var(--a-space-3-5) * var(--a-gap-k));--a-gap-xl:calc(var(--a-space-4) * var(--a-gap-k));--a-gap:var(--a-gap-md);--a-radius-min:.25rem;--a-radius-max:.75rem;--a-radius-xs:clamp(var(--a-radius-min), calc(var(--a-radius-k) * var(--a-radius-max) * var(--a-radius-xs-k)), var(--a-radius-max));--a-radius-sm:clamp(var(--a-radius-min), calc(var(--a-radius-k) * var(--a-radius-max) * var(--a-radius-sm-k)), var(--a-radius-max));--a-radius-md:clamp(var(--a-radius-min), calc(var(--a-radius-k) * var(--a-radius-max) * var(--a-radius-md-k)), var(--a-radius-max));--a-radius-lg:clamp(var(--a-radius-min), calc(var(--a-radius-k) * var(--a-radius-max) * var(--a-radius-lg-k)), var(--a-radius-max));--a-radius:var(--a-radius-md);--a-size-sm:calc(var(--a-density) * 1.25rem);--a-size-md:calc(var(--a-density) * 1.5rem);--a-size-lg:calc(var(--a-density) * 1.75rem);--a-size:var(--a-size-md);--a-icon-size:16px;--a-caret-size:14px;--a-toggle-size:var(--a-space-5);--a-display-sm:18px;--a-display-md:23px;--a-display-lg:29px;--a-title-sm:16px;--a-title-md:19px;--a-title-lg:22px;--a-heading-sm:13px;--a-heading-md:14px;--a-heading-lg:15px;--a-section-sm:13px;--a-section-md:14px;--a-section-lg:16px;--a-subsection-sm:12px;--a-subsection-md:13px;--a-subsection-lg:14px;--a-body-sm:11px;--a-body-md:12px;--a-body-lg:13px;--a-deck-sm:14px;--a-deck-md:15px;--a-deck-lg:16px;--a-caption-sm:10px;--a-caption-md:11px;--a-caption-lg:12px;--a-kicker-sm:10px;--a-kicker-md:10px;--a-kicker-lg:11px;--a-label-sm:10px;--a-label-md:10px;--a-label-lg:11px;--a-metric-sm:19px;--a-metric-md:25px;--a-metric-lg:34px;--a-code-sm:11px;--a-code-md:12px;--a-code-lg:13px;--a-ui-px:var(--a-space-2);--a-ui-py:var(--a-space-1);--a-ui-sm:11px;--a-ui-md:12px;--a-ui-lg:13px}[verse]:not([size]){--a-display-size:var(--a-display-md);--a-title-size:var(--a-title-md);--a-heading-size:var(--a-heading-md);--a-section-size:var(--a-section-md);--a-subsection-size:var(--a-subsection-md);--a-body-size:var(--a-body-md);--a-deck-size:var(--a-deck-md);--a-caption-size:var(--a-caption-md);--a-kicker-size:var(--a-kicker-md);--a-label-size:var(--a-label-md);--a-metric-size:var(--a-metric-md);--a-code-size:var(--a-code-md);--a-ui-size:var(--a-ui-md)}[verse][size=lg],[verse] [size=lg]{--a-inset:var(--a-inset-lg);--a-gap:var(--a-gap-lg);--a-size:var(--a-size-lg);--a-icon-size:18px;--a-caret-size:16px;--a-toggle-size:var(--a-space-6)}[verse][size=sm],[verse] [size=sm]{--a-inset:var(--a-inset-sm);--a-gap:var(--a-gap-sm);--a-size:var(--a-size-sm);--a-icon-size:14px;--a-caret-size:12px;--a-toggle-size:var(--a-space-4)}}",z=null;ba=W});var J={};O(J,{constructSheet:()=>X,default:()=>xa});function X(){return typeof CSSStyleSheet>"u"?null:(_||(_=new CSSStyleSheet,_.replaceSync(ya)),_)}var ya,_,xa,Q=E(()=>{"use strict";ya="@layer context{[prose]{--a-radius-min:.375rem;--a-radius-max:1.75rem;--a-radius-sm:clamp(var(--a-radius-min), calc(var(--a-radius-k) * var(--a-radius-max) * var(--a-radius-sm-k)), var(--a-radius-max));--a-radius-md:clamp(var(--a-radius-min), calc(var(--a-radius-k) * var(--a-radius-max) * var(--a-radius-md-k)), var(--a-radius-max));--a-radius-lg:clamp(var(--a-radius-min), calc(var(--a-radius-k) * var(--a-radius-max) * var(--a-radius-lg-k)), var(--a-radius-max));--a-radius:var(--a-radius-md);--a-inset-sm:var(--a-space-8);--a-inset-md:var(--a-space-10);--a-inset-lg:var(--a-space-12);--a-inset:var(--a-inset-md);--a-gap-xs:calc(var(--a-space-3) * var(--a-gap-k));--a-gap-sm:calc(var(--a-space-4) * var(--a-gap-k));--a-gap-md:calc(var(--a-space-5) * var(--a-gap-k));--a-gap-lg:calc(var(--a-space-6) * var(--a-gap-k));--a-gap-xl:calc(var(--a-space-7) * var(--a-gap-k));--a-gap:var(--a-gap-md);--a-size-sm:calc(var(--a-density) * 1.75rem);--a-size-md:calc(var(--a-density) * 2.25rem);--a-size-lg:calc(var(--a-density) * 2.75rem);--a-size:var(--a-size-md);--a-display-sm:clamp(24px, 20px + 1.5vw, 36px);--a-display-md:clamp(32px, 24px + 3vw, 56px);--a-display-lg:clamp(40px, 32px + 4vw, 80px);--a-display-size:var(--a-display-md);--a-title-sm:clamp(18px, 16px + .75vw, 24px);--a-title-md:clamp(24px, 20px + 1.5vw, 36px);--a-title-lg:clamp(28px, 24px + 2vw, 48px);--a-title-size:var(--a-title-md);--a-heading-sm:16px;--a-heading-md:20px;--a-heading-lg:24px;--a-heading-size:var(--a-heading-md);--a-section-sm:14px;--a-section-md:17px;--a-section-lg:20px;--a-section-size:var(--a-section-md);--a-subsection-sm:13px;--a-subsection-md:15px;--a-subsection-lg:17px;--a-subsection-size:var(--a-subsection-md);--a-body-sm:14px;--a-body-md:16px;--a-body-lg:18px;--a-body-size:var(--a-body-md);--a-deck-sm:15px;--a-deck-md:18px;--a-deck-lg:20px;--a-deck-size:var(--a-deck-md);--a-caption-sm:14px;--a-caption-md:15px;--a-caption-lg:16px;--a-caption-size:var(--a-caption-md);--a-kicker-sm:14px;--a-kicker-md:15px;--a-kicker-lg:16px;--a-kicker-size:var(--a-kicker-md);--a-label-sm:12px;--a-label-md:13px;--a-label-lg:14px;--a-label-size:var(--a-label-md);--a-metric-sm:clamp(20px, 16px + 1.5vw, 32px);--a-metric-md:clamp(28px, 24px + 2vw, 48px);--a-metric-lg:clamp(40px, 32px + 4vw, 72px);--a-metric-size:var(--a-metric-md);--a-code-sm:14px;--a-code-md:15px;--a-code-lg:16px;--a-code-size:var(--a-code-md);--a-ui-px:var(--a-space-3);--a-ui-py:var(--a-space-2);--a-ui-sm:14px;--a-ui-md:15px;--a-ui-lg:16px;--a-ui-size:var(--a-ui-md);--prose-max-width-sm:55ch;--prose-max-width-md:65ch;--prose-max-width-lg:75ch;--prose-max-width:var(--prose-max-width-md)}[prose][size=lg],[prose] [size=lg]{--a-inset:var(--a-inset-lg);--a-gap:var(--a-gap-lg);--a-size:var(--a-size-lg);--a-radius:var(--a-radius-lg)}[prose][size=sm],[prose] [size=sm]{--a-inset:var(--a-inset-sm);--a-gap:var(--a-gap-sm);--a-size:var(--a-size-sm);--a-radius:var(--a-radius-sm)}[prose]>:is(p,ul,ol,blockquote,pre,table,dl){max-width:var(--prose-max-width)}[prose] :is(ul,ol){margin-block:.75em;padding-inline-start:1.75em}[prose] li+li{margin-block-start:.375em}[prose] blockquote{padding:var(--a-space-4) var(--a-space-6);font-size:var(--a-body-size);border-inline-start-width:4px}[prose] hr{margin-block:var(--a-space-6)}[prose] table{border:1px solid var(--a-border-subtle);border-radius:var(--a-radius-md);overflow:hidden}[prose] th{background:var(--a-bg-muted)}[prose] pre{padding:var(--a-space-5)}[prose] img{border-radius:var(--a-radius-lg)}}",_=null;xa=X});function Ra(a,r){customElements.define(a,r)}function H(a,r){return customElements.get(a)?!1:(customElements.define(a,r),!0)}function Fa(a){return!!customElements.get(a)}var j=Symbol("signal"),v=null,g=null,S=!1;function Z(a){for(let r of a){if(r.disposed){a.delete(r);continue}r.dirty=!0,g||(g=new Set,S||queueMicrotask(aa)),g.add(r)}}function aa(){let a,r=0;for(;a=g;){if(++r>100){g=null,console.error("signals: drain loop exceeded 100 iterations");break}g=null;for(let e of a)if(!e.disposed&&e.dirty){e.dirty=!1;try{e.run()}catch(o){e.onError?e.onError(o):(e.disposed=!0,queueMicrotask(()=>{throw o}))}}}}function ka(a){if(S){a();return}S=!0;try{a()}finally{S=!1,g&&aa()}}function M(a){let r=v;v=null;try{return a()}finally{v=r}}function u(a){let r=new Set;return{[j]:!0,get value(){return v&&r.add(v),a},set value(e){Object.is(a,e)||(a=e,Z(r))},peek(){return a}}}function $(a){let r=new Set,e,o=!0,t={dirty:!1,disposed:!1,run(){o=!0,Z(r)}};return{[j]:!0,get value(){if(v&&r.add(v),o){let i=v;v=t;try{e=a(),o=!1}finally{v=i}}return e},peek(){return e}}}function p(a,r){let e={dirty:!1,disposed:!1,host:r?.host??null,onError:r?.onError??null,run(){let o=v;v=e;try{a()}finally{v=o}}};return e.run(),()=>{e.disposed=!0}}function L(a){return a!=null&&typeof a=="object"&&a[j]===!0}var[P,f]=[Symbol(),Symbol()];function wa(a,...r){return{strings:a,values:r}}function za(a,...r){let e="";for(let t=0;t<a.length;t++)e+=a[t],t<r.length&&(e+=r[t]);let o=new CSSStyleSheet;return o.replaceSync(e),o}var ra=new WeakMap;function _a(a){let r=0,e=0,o=0;for(;o<a.length;){if(r===0&&a.charCodeAt(o)===60&&a.charCodeAt(o+1)===33&&a.charCodeAt(o+2)===45&&a.charCodeAt(o+3)===45){let i=a.indexOf("-->",o+4);if(i===-1){e=0;break}o=i+3,e=0;continue}let t=a.charCodeAt(o);r?t===(r===1?39:34)&&(r=0):t===39?r=1:t===34?r=2:t===60?e=1:t===62&&(e=0),o++}return e===1}function ja(a){let r=ra.get(a);if(r)return r;let e="";for(let o=0;o<a.length;o++)e+=a[o],o<a.length-1&&(e+=_a(e)?`{{p:${o}}}`:`<!--p:${o}-->`);return r=document.createElement("template"),r.innerHTML=e,ra.set(a,r),r}var ea={classname:"className",innertext:"innerText",innerhtml:"innerHTML",outerhtml:"outerHTML",textcontent:"textContent",tabindex:"tabIndex",arialabel:"ariaLabel",ariadescribedby:"ariaDescribedBy",arialabelledby:"ariaLabelledBy",ariarole:"role",contenteditable:"contentEditable",readonly:"readOnly",maxlength:"maxLength",minlength:"minLength",colspan:"colSpan",rowspan:"rowSpan",cellpadding:"cellPadding",cellspacing:"cellSpacing",usemap:"useMap",ismap:"isMap",accesskey:"accessKey",defaultchecked:"defaultChecked",defaultvalue:"defaultValue",defaultselected:"defaultSelected"};function oa(a,r){if(ea[r])return ea[r];let e=Object.getOwnPropertyNames(a);for(let t=0;t<e.length;t++){let i=e[t];if(i!==r&&i.toLowerCase()===r)return i}let o=Object.getPrototypeOf(a);for(;o&&o!==Object.prototype;){let t=Object.getOwnPropertyNames(o);for(let i=0;i<t.length;i++){let c=t[i];if(c!==r&&c.toLowerCase()===r)return c}o=Object.getPrototypeOf(o)}return r}function h(a,r){let e=r._i;(!e||e.s!==a.strings)&&(e&&C(e.p),e=Sa(a,r),r._i=e),Ta(e.p,a.values)}function Sa(a,r){let{strings:e}=a,t=ja(e).content.cloneNode(!0),i=qa(r);i&&(t=Ca(t,i));let c=Aa(t,a.values.length);return r.replaceChildren(t),{s:e,p:c}}var q="http://www.w3.org/2000/svg",b="http://www.w3.org/1998/Math/MathML",ta="http://www.w3.org/1999/xhtml";function qa(a){if(!a||a.nodeType!==1)return null;if(a.namespaceURI===q)return q;if(a.namespaceURI===b)return b;if(typeof a.closest!="function")return null;let r=a.closest("svg, math, foreignObject, annotation-xml");if(!r)return null;let e=r.localName;if(e==="foreignobject"||e==="foreignObject")return null;if(e==="annotation-xml"){let o=(r.getAttribute("encoding")||"").toLowerCase();return o==="text/html"||o==="application/xhtml+xml"?null:b}return e==="svg"?q:e==="math"?b:null}function Ca(a,r){let e=document.createDocumentFragment();return ia(a,e,r),e}function ia(a,r,e){for(let o of[...a.childNodes])if(o.nodeType===1){let i=document.createElementNS(e,o.localName);for(let n of o.attributes)n.namespaceURI?i.setAttributeNS(n.namespaceURI,n.name,n.value):i.setAttribute(n.name,n.value);r.appendChild(i);let c=o.localName,l=e;if(e===q&&(c==="foreignObject"||c==="foreignobject"))l=ta;else if(e===b&&c==="annotation-xml"){let n=(o.getAttribute("encoding")||"").toLowerCase();(n==="text/html"||n==="application/xhtml+xml")&&(l=ta)}ia(o,i,l)}else r.appendChild(o.cloneNode(!0))}function Aa(a,r){let e=new Array(r),o=document.createTreeWalker(a,129),t;for(;t=o.nextNode();)if(t.nodeType===8){let i=t.data.match(/^p:(\d+)$/);if(i){let c=document.createTextNode("");t.replaceWith(c),o.currentNode=c,e[+i[1]]={t:"n",n:c,c:void 0,_fx:null}}}else if(t.nodeType===1)for(let i of[...t.attributes]){let c=i.value.match(/^\{\{p:(\d+)\}\}$/);if(!c){if(i.value.includes("{{p:")){let s=i.name,d=s==="class"?' class="${expression}" \u2190 full replacement (whole class string is the expression)\n .className=${expression} \u2190 writes to the className property (resolved camelCase since FB-55 fix)\n':s==="style"?' style="${expression}" \u2190 full replacement of the style string\n .style.cssText=${expression} \u2190 write CSS text via the style.cssText accessor\n':` ${s}="\${expression}" \u2190 full replacement (whole attr is the placeholder)
1
+ var pa=Object.defineProperty;var E=(a,r,e)=>()=>{if(e)throw e[0];try{return a&&(r=a(a=0)),r}catch(o){throw e=[o],o}};var O=(a,r)=>{for(var e in r)pa(a,e,{get:r[e],enumerable:!0})};var V={};O(V,{constructSheet:()=>G,default:()=>ha});function G(){return typeof CSSStyleSheet>"u"?null:(w||(w=new CSSStyleSheet,w.replaceSync(ua)),w)}var ua,w,ha,D=E(()=>{"use strict";ua="@layer context{[data-scheme=light]{color-scheme:light}[data-scheme=dark]{color-scheme:dark}[data-scheme=system]{color-scheme:light dark}[theme=default]{--a-neutral-hue:225;--a-neutral-c-min:.01;--a-brand-hue:225;--a-primary-hue:225;--a-success-hue:145;--a-warning-hue:65;--a-danger-hue:25;--a-info-hue:200;--a-radius-k:1;--a-density:1;--a-shadow-intensity:1}[theme=ocean]{--a-neutral-hue:210;--a-neutral-c-min:.02;--a-brand-hue:200;--a-primary-hue:200;--a-success-hue:160;--a-warning-hue:55;--a-danger-hue:15;--a-info-hue:190;--a-primary-c-max:.2;--a-brand-c-max:.2;--a-radius-k:1.5;--a-density:1.1}[theme=forest]{--a-neutral-hue:150;--a-neutral-c-min:.018;--a-neutral-c-max:.03;--a-brand-hue:140;--a-primary-hue:140;--a-success-hue:145;--a-warning-hue:60;--a-danger-hue:20;--a-info-hue:180;--a-primary-c-max:.14;--a-brand-c-max:.14;--a-radius-k:.5;--a-density:.9}[theme=sunset]{--a-neutral-hue:30;--a-neutral-c-min:.022;--a-brand-hue:20;--a-primary-hue:20;--a-success-hue:145;--a-warning-hue:50;--a-danger-hue:10;--a-info-hue:200;--a-primary-c-max:.22;--a-brand-c-max:.22;--a-radius-k:.25;--a-density:1.1}[theme=lavender]{--a-neutral-hue:280;--a-neutral-c-min:.018;--a-brand-hue:270;--a-primary-hue:270;--a-success-hue:145;--a-warning-hue:65;--a-danger-hue:25;--a-info-hue:220;--a-primary-c-max:.15;--a-brand-c-max:.15;--a-radius-k:2;--a-density:1.1}[theme=rose]{--a-neutral-hue:350;--a-neutral-c-min:.016;--a-brand-hue:340;--a-primary-hue:340;--a-success-hue:145;--a-warning-hue:55;--a-danger-hue:15;--a-info-hue:200;--a-primary-c-max:.17;--a-brand-c-max:.17;--a-radius-k:.75;--a-density:1}[theme=slate]{--a-neutral-hue:220;--a-neutral-c-min:.008;--a-neutral-c-max:.015;--a-brand-hue:220;--a-primary-hue:220;--a-success-hue:145;--a-warning-hue:65;--a-danger-hue:25;--a-info-hue:200;--a-primary-c-max:.1;--a-brand-c-max:.1;--a-radius-k:.35;--a-density:.85;--a-shadow-intensity:.5}[theme=midnight]{--a-neutral-hue:250;--a-neutral-c-min:.02;--a-brand-hue:240;--a-primary-hue:240;--a-success-hue:150;--a-warning-hue:60;--a-danger-hue:20;--a-info-hue:210;--a-primary-c-max:.22;--a-brand-c-max:.22;--a-radius-k:1.25;--a-density:1.1}}",w=null;ha=G});var U={};O(U,{constructSheet:()=>W,default:()=>ba});function W(){return typeof CSSStyleSheet>"u"?null:(z||(z=new CSSStyleSheet,z.replaceSync(fa)),z)}var fa,z,ba,K=E(()=>{"use strict";fa="@layer context{[verse]{--a-inset-sm:var(--a-space-2-5);--a-inset-md:var(--a-space-3);--a-inset-lg:var(--a-space-3-5);--a-inset:var(--a-inset-md);--a-gap-xs:calc(var(--a-space-2) * var(--a-gap-k));--a-gap-sm:calc(var(--a-space-2-5) * var(--a-gap-k));--a-gap-md:calc(var(--a-space-3) * var(--a-gap-k));--a-gap-lg:calc(var(--a-space-3-5) * var(--a-gap-k));--a-gap-xl:calc(var(--a-space-4) * var(--a-gap-k));--a-gap:var(--a-gap-md);--a-radius-min:.25rem;--a-radius-max:.75rem;--a-radius-xs:clamp(var(--a-radius-min), calc(var(--a-radius-k) * var(--a-radius-max) * var(--a-radius-xs-k)), var(--a-radius-max));--a-radius-sm:clamp(var(--a-radius-min), calc(var(--a-radius-k) * var(--a-radius-max) * var(--a-radius-sm-k)), var(--a-radius-max));--a-radius-md:clamp(var(--a-radius-min), calc(var(--a-radius-k) * var(--a-radius-max) * var(--a-radius-md-k)), var(--a-radius-max));--a-radius-lg:clamp(var(--a-radius-min), calc(var(--a-radius-k) * var(--a-radius-max) * var(--a-radius-lg-k)), var(--a-radius-max));--a-radius:var(--a-radius-md);--a-size-sm:calc(var(--a-density) * 1.25rem);--a-size-md:calc(var(--a-density) * 1.5rem);--a-size-lg:calc(var(--a-density) * 1.75rem);--a-size:var(--a-size-md);--a-icon-size:16px;--a-caret-size:14px;--a-toggle-size:var(--a-space-5);--a-display-sm:18px;--a-display-md:23px;--a-display-lg:29px;--a-title-sm:16px;--a-title-md:19px;--a-title-lg:22px;--a-heading-sm:13px;--a-heading-md:14px;--a-heading-lg:15px;--a-section-sm:13px;--a-section-md:14px;--a-section-lg:16px;--a-subsection-sm:12px;--a-subsection-md:13px;--a-subsection-lg:14px;--a-body-sm:11px;--a-body-md:12px;--a-body-lg:13px;--a-deck-sm:14px;--a-deck-md:15px;--a-deck-lg:16px;--a-caption-sm:10px;--a-caption-md:11px;--a-caption-lg:12px;--a-kicker-sm:10px;--a-kicker-md:10px;--a-kicker-lg:11px;--a-label-sm:10px;--a-label-md:10px;--a-label-lg:11px;--a-metric-sm:19px;--a-metric-md:25px;--a-metric-lg:34px;--a-code-sm:11px;--a-code-md:12px;--a-code-lg:13px;--a-ui-px:var(--a-space-2);--a-ui-py:var(--a-space-1);--a-ui-sm:11px;--a-ui-md:12px;--a-ui-lg:13px}[verse]:not([size]){--a-display-size:var(--a-display-md);--a-title-size:var(--a-title-md);--a-heading-size:var(--a-heading-md);--a-section-size:var(--a-section-md);--a-subsection-size:var(--a-subsection-md);--a-body-size:var(--a-body-md);--a-deck-size:var(--a-deck-md);--a-caption-size:var(--a-caption-md);--a-kicker-size:var(--a-kicker-md);--a-label-size:var(--a-label-md);--a-metric-size:var(--a-metric-md);--a-code-size:var(--a-code-md);--a-ui-size:var(--a-ui-md)}[verse][size=lg],[verse] [size=lg]{--a-inset:var(--a-inset-lg);--a-gap:var(--a-gap-lg);--a-size:var(--a-size-lg);--a-icon-size:18px;--a-caret-size:16px;--a-toggle-size:var(--a-space-6)}[verse][size=sm],[verse] [size=sm]{--a-inset:var(--a-inset-sm);--a-gap:var(--a-gap-sm);--a-size:var(--a-size-sm);--a-icon-size:14px;--a-caret-size:12px;--a-toggle-size:var(--a-space-4)}}",z=null;ba=W});var J={};O(J,{constructSheet:()=>X,default:()=>xa});function X(){return typeof CSSStyleSheet>"u"?null:(_||(_=new CSSStyleSheet,_.replaceSync(ya)),_)}var ya,_,xa,Q=E(()=>{"use strict";ya="@layer context{[prose]{--a-radius-min:.375rem;--a-radius-max:1.75rem;--a-radius-sm:clamp(var(--a-radius-min), calc(var(--a-radius-k) * var(--a-radius-max) * var(--a-radius-sm-k)), var(--a-radius-max));--a-radius-md:clamp(var(--a-radius-min), calc(var(--a-radius-k) * var(--a-radius-max) * var(--a-radius-md-k)), var(--a-radius-max));--a-radius-lg:clamp(var(--a-radius-min), calc(var(--a-radius-k) * var(--a-radius-max) * var(--a-radius-lg-k)), var(--a-radius-max));--a-radius:var(--a-radius-md);--a-inset-sm:var(--a-space-8);--a-inset-md:var(--a-space-10);--a-inset-lg:var(--a-space-12);--a-inset:var(--a-inset-md);--a-gap-xs:calc(var(--a-space-3) * var(--a-gap-k));--a-gap-sm:calc(var(--a-space-4) * var(--a-gap-k));--a-gap-md:calc(var(--a-space-5) * var(--a-gap-k));--a-gap-lg:calc(var(--a-space-6) * var(--a-gap-k));--a-gap-xl:calc(var(--a-space-7) * var(--a-gap-k));--a-gap:var(--a-gap-md);--a-size-sm:calc(var(--a-density) * 1.75rem);--a-size-md:calc(var(--a-density) * 2.25rem);--a-size-lg:calc(var(--a-density) * 2.75rem);--a-size:var(--a-size-md);--a-display-sm:clamp(24px, 20px + 1.5vw, 36px);--a-display-md:clamp(32px, 24px + 3vw, 56px);--a-display-lg:clamp(40px, 32px + 4vw, 80px);--a-display-size:var(--a-display-md);--a-title-sm:clamp(18px, 16px + .75vw, 24px);--a-title-md:clamp(24px, 20px + 1.5vw, 36px);--a-title-lg:clamp(28px, 24px + 2vw, 48px);--a-title-size:var(--a-title-md);--a-heading-sm:16px;--a-heading-md:20px;--a-heading-lg:24px;--a-heading-size:var(--a-heading-md);--a-section-sm:14px;--a-section-md:17px;--a-section-lg:20px;--a-section-size:var(--a-section-md);--a-subsection-sm:13px;--a-subsection-md:15px;--a-subsection-lg:17px;--a-subsection-size:var(--a-subsection-md);--a-body-sm:14px;--a-body-md:16px;--a-body-lg:18px;--a-body-size:var(--a-body-md);--a-deck-sm:15px;--a-deck-md:18px;--a-deck-lg:20px;--a-deck-size:var(--a-deck-md);--a-caption-sm:14px;--a-caption-md:15px;--a-caption-lg:16px;--a-caption-size:var(--a-caption-md);--a-kicker-sm:14px;--a-kicker-md:15px;--a-kicker-lg:16px;--a-kicker-size:var(--a-kicker-md);--a-label-sm:12px;--a-label-md:13px;--a-label-lg:14px;--a-label-size:var(--a-label-md);--a-metric-sm:clamp(20px, 16px + 1.5vw, 32px);--a-metric-md:clamp(28px, 24px + 2vw, 48px);--a-metric-lg:clamp(40px, 32px + 4vw, 72px);--a-metric-size:var(--a-metric-md);--a-code-sm:14px;--a-code-md:15px;--a-code-lg:16px;--a-code-size:var(--a-code-md);--a-ui-px:var(--a-space-3);--a-ui-py:var(--a-space-2);--a-ui-sm:14px;--a-ui-md:15px;--a-ui-lg:16px;--a-ui-size:var(--a-ui-md);--prose-max-width-sm:55ch;--prose-max-width-md:65ch;--prose-max-width-lg:75ch;--prose-max-width:var(--prose-max-width-md)}[prose][size=lg],[prose] [size=lg]{--a-inset:var(--a-inset-lg);--a-gap:var(--a-gap-lg);--a-size:var(--a-size-lg);--a-radius:var(--a-radius-lg)}[prose][size=sm],[prose] [size=sm]{--a-inset:var(--a-inset-sm);--a-gap:var(--a-gap-sm);--a-size:var(--a-size-sm);--a-radius:var(--a-radius-sm)}[prose]>:is(p,ul,ol,blockquote,pre,table,dl){max-width:var(--prose-max-width)}[prose] :is(ul,ol){margin-block:.75em;padding-inline-start:1.75em}[prose] li+li{margin-block-start:.375em}[prose] blockquote{padding:var(--a-space-4) var(--a-space-6);font-size:var(--a-body-size);border-inline-start-width:4px}[prose] hr{margin-block:var(--a-space-6)}[prose] table{border:1px solid var(--a-border-subtle);border-radius:var(--a-radius-md);overflow:hidden}[prose] th{background:var(--a-bg-muted)}[prose] pre{padding:var(--a-space-5)}[prose] img{border-radius:var(--a-radius-lg)}}",_=null;xa=X});function Ra(a,r){customElements.define(a,r)}function H(a,r){return customElements.get(a)?!1:(customElements.define(a,r),!0)}function Fa(a){return!!customElements.get(a)}var j=Symbol("signal"),v=null,g=null,S=!1;function Z(a){for(let r of a){if(r.disposed){a.delete(r);continue}r.dirty=!0,g||(g=new Set,S||queueMicrotask(aa)),g.add(r)}}function aa(){let a,r=0;for(;a=g;){if(++r>100){g=null,console.error("signals: drain loop exceeded 100 iterations");break}g=null;for(let e of a)if(!e.disposed&&e.dirty){e.dirty=!1;try{e.run()}catch(o){e.onError?e.onError(o):(e.disposed=!0,queueMicrotask(()=>{throw o}))}}}}function ka(a){if(S){a();return}S=!0;try{a()}finally{S=!1,g&&aa()}}function M(a){let r=v;v=null;try{return a()}finally{v=r}}function u(a){let r=new Set;return{[j]:!0,get value(){return v&&r.add(v),a},set value(e){Object.is(a,e)||(a=e,Z(r))},peek(){return a}}}function $(a){let r=new Set,e,o=!0,t={dirty:!1,disposed:!1,run(){o=!0,Z(r)}};return{[j]:!0,get value(){if(v&&r.add(v),o){let i=v;v=t;try{e=a(),o=!1}finally{v=i}}return e},peek(){return e}}}function p(a,r){let e={dirty:!1,disposed:!1,host:r?.host??null,onError:r?.onError??null,run(){let o=v;v=e;try{a()}finally{v=o}}};return e.run(),()=>{e.disposed=!0}}function L(a){return a!=null&&typeof a=="object"&&a[j]===!0}var[P,f]=[Symbol(),Symbol()];function wa(a,...r){return{strings:a,values:r}}function za(a,...r){let e="";for(let t=0;t<a.length;t++)e+=a[t],t<r.length&&(e+=r[t]);let o=new CSSStyleSheet;return o.replaceSync(e),o}var ra=new WeakMap;function _a(a){let r=0,e=0,o=0;for(;o<a.length;){if(r===0&&a.charCodeAt(o)===60&&a.charCodeAt(o+1)===33&&a.charCodeAt(o+2)===45&&a.charCodeAt(o+3)===45){let i=a.indexOf("-->",o+4);if(i===-1){e=0;break}o=i+3,e=0;continue}let t=a.charCodeAt(o);r?t===(r===1?39:34)&&(r=0):t===39?r=1:t===34?r=2:t===60?e=1:t===62&&(e=0),o++}return e===1}function ja(a){let r=ra.get(a);if(r)return r;let e="";for(let o=0;o<a.length;o++)e+=a[o],o<a.length-1&&(e+=_a(e)?`{{p:${o}}}`:`<!--p:${o}-->`);return r=document.createElement("template"),r.innerHTML=e,ra.set(a,r),r}var ea={classname:"className",innertext:"innerText",innerhtml:"innerHTML",outerhtml:"outerHTML",textcontent:"textContent",tabindex:"tabIndex",arialabel:"ariaLabel",ariadescribedby:"ariaDescribedBy",arialabelledby:"ariaLabelledBy",ariarole:"role",contenteditable:"contentEditable",readonly:"readOnly",maxlength:"maxLength",minlength:"minLength",colspan:"colSpan",rowspan:"rowSpan",cellpadding:"cellPadding",cellspacing:"cellSpacing",usemap:"useMap",ismap:"isMap",accesskey:"accessKey",defaultchecked:"defaultChecked",defaultvalue:"defaultValue",defaultselected:"defaultSelected"};function oa(a,r){if(ea[r])return ea[r];let e=Object.getOwnPropertyNames(a);for(let t=0;t<e.length;t++){let i=e[t];if(i!==r&&i.toLowerCase()===r)return i}let o=Object.getPrototypeOf(a);for(;o&&o!==Object.prototype;){let t=Object.getOwnPropertyNames(o);for(let i=0;i<t.length;i++){let c=t[i];if(c!==r&&c.toLowerCase()===r)return c}o=Object.getPrototypeOf(o)}return r}function h(a,r){let e=r._i;(!e||e.s!==a.strings)&&(e&&C(e.p),e=Sa(a,r),r._i=e),Ta(e.p,a.values)}function Sa(a,r){let{strings:e}=a,t=ja(e).content.cloneNode(!0),i=qa(r);i&&(t=Ca(t,i));let c=Aa(t,a.values.length);return r.replaceChildren(t),{s:e,p:c}}var q="http://www.w3.org/2000/svg",b="http://www.w3.org/1998/Math/MathML",ta="http://www.w3.org/1999/xhtml";function qa(a){if(!a||a.nodeType!==1)return null;if(a.namespaceURI===q)return q;if(a.namespaceURI===b)return b;if(typeof a.closest!="function")return null;let r=a.closest("svg, math, foreignObject, annotation-xml");if(!r)return null;let e=r.localName;if(e==="foreignobject"||e==="foreignObject")return null;if(e==="annotation-xml"){let o=(r.getAttribute("encoding")||"").toLowerCase();return o==="text/html"||o==="application/xhtml+xml"?null:b}return e==="svg"?q:e==="math"?b:null}function Ca(a,r){let e=document.createDocumentFragment();return ia(a,e,r),e}function ia(a,r,e){for(let o of[...a.childNodes])if(o.nodeType===1){let i=document.createElementNS(e,o.localName);for(let n of o.attributes)n.namespaceURI?i.setAttributeNS(n.namespaceURI,n.name,n.value):i.setAttribute(n.name,n.value);r.appendChild(i);let c=o.localName,l=e;if(e===q&&(c==="foreignObject"||c==="foreignobject"))l=ta;else if(e===b&&c==="annotation-xml"){let n=(o.getAttribute("encoding")||"").toLowerCase();(n==="text/html"||n==="application/xhtml+xml")&&(l=ta)}ia(o,i,l)}else r.appendChild(o.cloneNode(!0))}function Aa(a,r){let e=new Array(r),o=document.createTreeWalker(a,129),t;for(;t=o.nextNode();)if(t.nodeType===8){let i=t.data.match(/^p:(\d+)$/);if(i){let c=document.createTextNode("");t.replaceWith(c),o.currentNode=c,e[+i[1]]={t:"n",n:c,c:void 0,_fx:null}}}else if(t.nodeType===1)for(let i of[...t.attributes]){let c=i.value.match(/^\{\{p:(\d+)\}\}$/);if(!c){if(i.value.includes("{{p:")){let s=i.name,d=s==="class"?' class="${expression}" \u2190 full replacement (whole class string is the expression)\n .className=${expression} \u2190 writes to the className property (resolved camelCase since FB-55 fix)\n':s==="style"?' style="${expression}" \u2190 full replacement of the style string\n .style.cssText=${expression} \u2190 write CSS text via the style.cssText accessor\n':` ${s}="\${expression}" \u2190 full replacement (whole attr is the placeholder)
2
2
  .${s}=\${expression} \u2190 property assignment (preferred for objects/functions)
3
3
  `;console.warn(`[template] Partial attribute interpolation is not supported.
4
4
  Element: <${t.tagName.toLowerCase()}>
@@ -1,4 +1,4 @@
1
- var lA=Object.defineProperty;var V=(s,t)=>()=>(s&&(t=s(s=0)),t);var Ft=(s,t)=>{for(var e in t)lA(s,e,{get:t[e],enumerable:!0})};function VO(s){for(let t of s){if(t.disposed){s.delete(t);continue}t.dirty=!0,rs||(rs=new Set,Yl||queueMicrotask(jO)),rs.add(t)}}function jO(){let s,t=0;for(;s=rs;){if(++t>100){rs=null,console.error("signals: drain loop exceeded 100 iterations");break}rs=null;for(let e of s)if(!e.disposed&&e.dirty){e.dirty=!1;try{e.run()}catch(i){e.onError?e.onError(i):(e.disposed=!0,queueMicrotask(()=>{throw i}))}}}}function fA(s){if(Yl){s();return}Yl=!0;try{s()}finally{Yl=!1,rs&&jO()}}function Mt(s){let t=ye;ye=null;try{return s()}finally{ye=t}}function Xi(s){let t=new Set;return{[Wl]:!0,get value(){return ye&&t.add(ye),s},set value(e){Object.is(s,e)||(s=e,VO(t))},peek(){return s}}}function Wu(s){let t=new Set,e,i=!0,n={dirty:!1,disposed:!1,run(){i=!0,VO(t)}};return{[Wl]:!0,get value(){if(ye&&t.add(ye),i){let r=ye;ye=n;try{e=s(),i=!1}finally{ye=r}}return e},peek(){return e}}}function os(s,t){let e={dirty:!1,disposed:!1,host:t?.host??null,onError:t?.onError??null,run(){let i=ye;ye=e;try{s()}finally{ye=i}}};return e.run(),()=>{e.disposed=!0}}function Yu(s){return s!=null&&typeof s=="object"&&s[Wl]===!0}var Wl,ye,rs,Yl,_e=V(()=>{"use strict";Wl=Symbol("signal"),ye=null,rs=null,Yl=!1});function Et(s,...t){return{strings:s,values:t}}function pA(s,...t){let e="";for(let n=0;n<s.length;n++)e+=s[n],n<t.length&&(e+=t[n]);let i=new CSSStyleSheet;return i.replaceSync(e),i}function mA(s){let t=0,e=0,i=0;for(;i<s.length;){if(t===0&&s.charCodeAt(i)===60&&s.charCodeAt(i+1)===33&&s.charCodeAt(i+2)===45&&s.charCodeAt(i+3)===45){let r=s.indexOf("-->",i+4);if(r===-1){e=0;break}i=r+3,e=0;continue}let n=s.charCodeAt(i);t?n===(t===1?39:34)&&(t=0):n===39?t=1:n===34?t=2:n===60?e=1:n===62&&(e=0),i++}return e===1}function gA(s){let t=_O.get(s);if(t)return t;let e="";for(let i=0;i<s.length;i++)e+=s[i],i<s.length-1&&(e+=mA(e)?`{{p:${i}}}`:`<!--p:${i}-->`);return t=document.createElement("template"),t.innerHTML=e,_O.set(s,t),t}function YO(s,t){if(WO[t])return WO[t];let e=Object.getOwnPropertyNames(s);for(let n=0;n<e.length;n++){let r=e[n];if(r!==t&&r.toLowerCase()===t)return r}let i=Object.getPrototypeOf(s);for(;i&&i!==Object.prototype;){let n=Object.getOwnPropertyNames(i);for(let r=0;r<n.length;r++){let o=n[r];if(o!==t&&o.toLowerCase()===t)return o}i=Object.getPrototypeOf(i)}return t}function Ks(s,t){let e=t._i;(!e||e.s!==s.strings)&&(e&&Ul(e.p),e=OA(s,t),t._i=e),xA(e.p,s.values)}function OA(s,t){let{strings:e}=s,n=gA(e).content.cloneNode(!0),r=bA(t);r&&(n=yA(n,r));let o=vA(n,s.values.length);return t.replaceChildren(n),{s:e,p:o}}function bA(s){if(!s||s.nodeType!==1)return null;if(s.namespaceURI===Fl)return Fl;if(s.namespaceURI===ga)return ga;if(typeof s.closest!="function")return null;let t=s.closest("svg, math, foreignObject, annotation-xml");if(!t)return null;let e=t.localName;if(e==="foreignobject"||e==="foreignObject")return null;if(e==="annotation-xml"){let i=(t.getAttribute("encoding")||"").toLowerCase();return i==="text/html"||i==="application/xhtml+xml"?null:ga}return e==="svg"?Fl:e==="math"?ga:null}function yA(s,t){let e=document.createDocumentFragment();return UO(s,e,t),e}function UO(s,t,e){for(let i of[...s.childNodes])if(i.nodeType===1){let r=document.createElementNS(e,i.localName);for(let l of i.attributes)l.namespaceURI?r.setAttributeNS(l.namespaceURI,l.name,l.value):r.setAttribute(l.name,l.value);t.appendChild(r);let o=i.localName,a=e;if(e===Fl&&(o==="foreignObject"||o==="foreignobject"))a=FO;else if(e===ga&&o==="annotation-xml"){let l=(i.getAttribute("encoding")||"").toLowerCase();(l==="text/html"||l==="application/xhtml+xml")&&(a=FO)}UO(i,r,a)}else t.appendChild(i.cloneNode(!0))}function vA(s,t){let e=new Array(t),i=document.createTreeWalker(s,129),n;for(;n=i.nextNode();)if(n.nodeType===8){let r=n.data.match(/^p:(\d+)$/);if(r){let o=document.createTextNode("");n.replaceWith(o),i.currentNode=o,e[+r[1]]={t:"n",n:o,c:void 0,_fx:null}}}else if(n.nodeType===1)for(let r of[...n.attributes]){let o=r.value.match(/^\{\{p:(\d+)\}\}$/);if(!o){if(r.value.includes("{{p:")){let h=r.name,c=h==="class"?' class="${expression}" \u2190 full replacement (whole class string is the expression)\n .className=${expression} \u2190 writes to the className property (resolved camelCase since FB-55 fix)\n':h==="style"?' style="${expression}" \u2190 full replacement of the style string\n .style.cssText=${expression} \u2190 write CSS text via the style.cssText accessor\n':` ${h}="\${expression}" \u2190 full replacement (whole attr is the placeholder)
1
+ var lA=Object.defineProperty;var V=(s,t,e)=>()=>{if(e)throw e[0];try{return s&&(t=s(s=0)),t}catch(i){throw e=[i],i}};var Ft=(s,t)=>{for(var e in t)lA(s,e,{get:t[e],enumerable:!0})};function VO(s){for(let t of s){if(t.disposed){s.delete(t);continue}t.dirty=!0,rs||(rs=new Set,Yl||queueMicrotask(jO)),rs.add(t)}}function jO(){let s,t=0;for(;s=rs;){if(++t>100){rs=null,console.error("signals: drain loop exceeded 100 iterations");break}rs=null;for(let e of s)if(!e.disposed&&e.dirty){e.dirty=!1;try{e.run()}catch(i){e.onError?e.onError(i):(e.disposed=!0,queueMicrotask(()=>{throw i}))}}}}function fA(s){if(Yl){s();return}Yl=!0;try{s()}finally{Yl=!1,rs&&jO()}}function Mt(s){let t=ye;ye=null;try{return s()}finally{ye=t}}function Xi(s){let t=new Set;return{[Wl]:!0,get value(){return ye&&t.add(ye),s},set value(e){Object.is(s,e)||(s=e,VO(t))},peek(){return s}}}function Wu(s){let t=new Set,e,i=!0,n={dirty:!1,disposed:!1,run(){i=!0,VO(t)}};return{[Wl]:!0,get value(){if(ye&&t.add(ye),i){let r=ye;ye=n;try{e=s(),i=!1}finally{ye=r}}return e},peek(){return e}}}function os(s,t){let e={dirty:!1,disposed:!1,host:t?.host??null,onError:t?.onError??null,run(){let i=ye;ye=e;try{s()}finally{ye=i}}};return e.run(),()=>{e.disposed=!0}}function Yu(s){return s!=null&&typeof s=="object"&&s[Wl]===!0}var Wl,ye,rs,Yl,_e=V(()=>{"use strict";Wl=Symbol("signal"),ye=null,rs=null,Yl=!1});function Et(s,...t){return{strings:s,values:t}}function pA(s,...t){let e="";for(let n=0;n<s.length;n++)e+=s[n],n<t.length&&(e+=t[n]);let i=new CSSStyleSheet;return i.replaceSync(e),i}function mA(s){let t=0,e=0,i=0;for(;i<s.length;){if(t===0&&s.charCodeAt(i)===60&&s.charCodeAt(i+1)===33&&s.charCodeAt(i+2)===45&&s.charCodeAt(i+3)===45){let r=s.indexOf("-->",i+4);if(r===-1){e=0;break}i=r+3,e=0;continue}let n=s.charCodeAt(i);t?n===(t===1?39:34)&&(t=0):n===39?t=1:n===34?t=2:n===60?e=1:n===62&&(e=0),i++}return e===1}function gA(s){let t=_O.get(s);if(t)return t;let e="";for(let i=0;i<s.length;i++)e+=s[i],i<s.length-1&&(e+=mA(e)?`{{p:${i}}}`:`<!--p:${i}-->`);return t=document.createElement("template"),t.innerHTML=e,_O.set(s,t),t}function YO(s,t){if(WO[t])return WO[t];let e=Object.getOwnPropertyNames(s);for(let n=0;n<e.length;n++){let r=e[n];if(r!==t&&r.toLowerCase()===t)return r}let i=Object.getPrototypeOf(s);for(;i&&i!==Object.prototype;){let n=Object.getOwnPropertyNames(i);for(let r=0;r<n.length;r++){let o=n[r];if(o!==t&&o.toLowerCase()===t)return o}i=Object.getPrototypeOf(i)}return t}function Ks(s,t){let e=t._i;(!e||e.s!==s.strings)&&(e&&Ul(e.p),e=OA(s,t),t._i=e),xA(e.p,s.values)}function OA(s,t){let{strings:e}=s,n=gA(e).content.cloneNode(!0),r=bA(t);r&&(n=yA(n,r));let o=vA(n,s.values.length);return t.replaceChildren(n),{s:e,p:o}}function bA(s){if(!s||s.nodeType!==1)return null;if(s.namespaceURI===Fl)return Fl;if(s.namespaceURI===ga)return ga;if(typeof s.closest!="function")return null;let t=s.closest("svg, math, foreignObject, annotation-xml");if(!t)return null;let e=t.localName;if(e==="foreignobject"||e==="foreignObject")return null;if(e==="annotation-xml"){let i=(t.getAttribute("encoding")||"").toLowerCase();return i==="text/html"||i==="application/xhtml+xml"?null:ga}return e==="svg"?Fl:e==="math"?ga:null}function yA(s,t){let e=document.createDocumentFragment();return UO(s,e,t),e}function UO(s,t,e){for(let i of[...s.childNodes])if(i.nodeType===1){let r=document.createElementNS(e,i.localName);for(let l of i.attributes)l.namespaceURI?r.setAttributeNS(l.namespaceURI,l.name,l.value):r.setAttribute(l.name,l.value);t.appendChild(r);let o=i.localName,a=e;if(e===Fl&&(o==="foreignObject"||o==="foreignobject"))a=FO;else if(e===ga&&o==="annotation-xml"){let l=(i.getAttribute("encoding")||"").toLowerCase();(l==="text/html"||l==="application/xhtml+xml")&&(a=FO)}UO(i,r,a)}else t.appendChild(i.cloneNode(!0))}function vA(s,t){let e=new Array(t),i=document.createTreeWalker(s,129),n;for(;n=i.nextNode();)if(n.nodeType===8){let r=n.data.match(/^p:(\d+)$/);if(r){let o=document.createTextNode("");n.replaceWith(o),i.currentNode=o,e[+r[1]]={t:"n",n:o,c:void 0,_fx:null}}}else if(n.nodeType===1)for(let r of[...n.attributes]){let o=r.value.match(/^\{\{p:(\d+)\}\}$/);if(!o){if(r.value.includes("{{p:")){let h=r.name,c=h==="class"?' class="${expression}" \u2190 full replacement (whole class string is the expression)\n .className=${expression} \u2190 writes to the className property (resolved camelCase since FB-55 fix)\n':h==="style"?' style="${expression}" \u2190 full replacement of the style string\n .style.cssText=${expression} \u2190 write CSS text via the style.cssText accessor\n':` ${h}="\${expression}" \u2190 full replacement (whole attr is the placeholder)
2
2
  .${h}=\${expression} \u2190 property assignment (preferred for objects/functions)
3
3
  `;console.warn(`[template] Partial attribute interpolation is not supported.
4
4
  Element: <${n.tagName.toLowerCase()}>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adia-ai/web-components",
3
- "version": "0.8.6",
3
+ "version": "0.8.7",
4
4
  "description": "AdiaUI web components \u2014 vanilla custom elements. A2UI runtime (renderer, registry, streams, wiring) lives in @adia-ai/a2ui-runtime.",
5
5
  "type": "module",
6
6
  "types": "./index.d.ts",
@@ -88,6 +88,7 @@
88
88
  "color/",
89
89
  "components/",
90
90
  "dist/",
91
+ "patterns/",
91
92
  "!components/**/*.html",
92
93
  "!components/**/*.examples.js",
93
94
  "components/**/*.examples.md",
@@ -0,0 +1,132 @@
1
+ <header>
2
+ <div>
3
+ <h1>Access requests</h1>
4
+ <div data-actions>
5
+ <tag-ui size="sm">card-ui</tag-ui> <tag-ui size="sm">field-ui</tag-ui> <tag-ui size="sm">alert-ui</tag-ui> <tag-ui size="sm">tag-ui</tag-ui>
6
+ </div>
7
+ </div>
8
+ <p>The "Request access" path when a user lacks permission for a resource. Three connected surfaces: the access-denied state with a Request CTA, the request form, and the pending-status follow-up. Sub-flavor of approvals (13d) — same async-gate semantics, different entry point.</p>
9
+ </header>
10
+
11
+ <section data-section data-property="when-to-use">
12
+ <h2 variant="section">When to use</h2>
13
+ <p data-note>
14
+ When a user clicks a link or opens a resource they don't have
15
+ permission to see. Hard-403 the resource but offer a path to
16
+ ask the owner — better UX than a dead end. The owner gets a
17
+ notification (15d) + an entry in their approval queue (13d);
18
+ the requester gets a pending state until the request resolves.
19
+ </p>
20
+ </section>
21
+
22
+ <section data-section data-property="access-denied-cta">
23
+ <h2 variant="section">Access denied — with Request CTA</h2>
24
+ <p data-note>The standard access-denied state (cross-ref 36d) augmented with a "Request access" primary action. <code>alert-ui variant="warning"</code> carries the explanation; the CTA opens the request form.</p>
25
+ <div data-artifact-container>
26
+ <div data-artifact-item data-artifact-label="access denied with request">
27
+ <card-ui data-chunk="access-denied-with-request" style="max-width: 480px;">
28
+ <header>
29
+ <span slot="heading" variant="section">You don't have access to this</span>
30
+ </header>
31
+ <section>
32
+ <alert-ui variant="warning" icon="lock">
33
+ <col-ui slot="content" gap="0-5">
34
+ <text-ui strong>Q4 product roadmap is restricted.</text-ui>
35
+ <text-ui>Owned by Avery Chen. Ask them for access, or check if your team has a different version.</text-ui>
36
+ </col-ui>
37
+ </alert-ui>
38
+ </section>
39
+ <footer divider>
40
+ <button-ui slot="action" text="Go back" variant="ghost"></button-ui>
41
+ <button-ui slot="action" text="Request access" variant="primary" icon-leading="paper-plane-tilt"></button-ui>
42
+ </footer>
43
+ </card-ui>
44
+ </div>
45
+ </div>
46
+ </section>
47
+
48
+ <section data-section data-property="request-form">
49
+ <h2 variant="section">Request form</h2>
50
+ <p data-note>The form the requester fills. Pre-fills the resource being requested; user picks the role they need + optional reason. Submit fires a notification to the owner.</p>
51
+ <div data-artifact-container>
52
+ <div data-artifact-item data-artifact-label="access request form">
53
+ <card-ui data-chunk="access-request-form" style="max-width: 560px;">
54
+ <header>
55
+ <span slot="heading" variant="section">Request access</span>
56
+ <text-ui slot="description" color="subtle">Avery Chen will be notified</text-ui>
57
+ </header>
58
+ <section>
59
+ <col-ui gap="3">
60
+ <field-ui label="Resource">
61
+ <input-ui name="resource" value="Q4 product roadmap" readonly></input-ui>
62
+ </field-ui>
63
+ <field-ui label="Role you need" required>
64
+ <select-ui name="role">
65
+ <option value="viewer" selected>Viewer — read only</option>
66
+ <option value="commenter">Commenter — read + comment</option>
67
+ <option value="editor">Editor — read + edit</option>
68
+ </select-ui>
69
+ </field-ui>
70
+ <field-ui label="Why do you need access?" hint="Optional but speeds up approval">
71
+ <textarea-ui name="reason" rows="3" placeholder="e.g., I'm reviewing the Q4 plan for the engineering breakdown."></textarea-ui>
72
+ </field-ui>
73
+ </col-ui>
74
+ </section>
75
+ <footer divider>
76
+ <button-ui slot="action" text="Cancel" variant="ghost"></button-ui>
77
+ <button-ui slot="action" text="Send request" variant="primary"></button-ui>
78
+ </footer>
79
+ </card-ui>
80
+ </div>
81
+ </div>
82
+ </section>
83
+
84
+ <section data-section data-property="request-pending">
85
+ <h2 variant="section">Pending status</h2>
86
+ <p data-note>The state the requester sees after submission. <code>alert-ui variant="info"</code> with the reviewer name + reasonable ETA. "Cancel request" + "View other resources" actions.</p>
87
+ <div data-artifact-container>
88
+ <div data-artifact-item data-artifact-label="access request pending">
89
+ <card-ui data-chunk="access-request-pending" style="max-width: 480px;">
90
+ <header>
91
+ <span slot="heading" variant="section">Request sent</span>
92
+ <tag-ui slot="action" variant="warning">Pending</tag-ui>
93
+ </header>
94
+ <section>
95
+ <alert-ui variant="info" icon="clock-counter-clockwise">
96
+ <col-ui slot="content" gap="0-5">
97
+ <text-ui strong>Avery Chen has been notified.</text-ui>
98
+ <text-ui>You'll get an email when they approve or decline. Most requests are answered within a business day.</text-ui>
99
+ </col-ui>
100
+ </alert-ui>
101
+ </section>
102
+ <footer divider>
103
+ <button-ui slot="action" text="Cancel request" variant="ghost"></button-ui>
104
+ <button-ui slot="action" text="View other resources" variant="primary"></button-ui>
105
+ </footer>
106
+ </card-ui>
107
+ </div>
108
+ </div>
109
+ </section>
110
+
111
+ <section data-section data-property="composition">
112
+ <h2 variant="section">Composition rules</h2>
113
+ <ul>
114
+ <li><strong>Always show the owner's name</strong> — "ask Avery" reads as a real path; "ask the owner" reads as a system error. The owner identity comes from the same authorization data that produced the 403.</li>
115
+ <li><strong>Pre-fill the resource</strong> — never make the user re-type the resource name. The link they clicked is the request payload.</li>
116
+ <li><strong>Default role = least-privilege</strong> — Viewer is the default; the user can escalate. This is the same posture the role-picker (36a) uses for new members.</li>
117
+ <li><strong>Reason is optional but encouraged</strong> — a one-line reason cuts approval lag. Frame the hint around speed, not surveillance.</li>
118
+ <li><strong>Pending state shows the reviewer + ETA</strong> — "Avery Chen has been notified · most requests answered within a business day" beats a generic "request sent" toast. The requester can plan around the wait.</li>
119
+ <li><strong>Cancel-request is reversible</strong> — let the user pull the request back without contacting the owner. This is a polite-by-default convention.</li>
120
+ <li><strong>Don't auto-grant after timeout</strong> — pending should stay pending forever (or until manually canceled). Auto-grant is a security smell.</li>
121
+ </ul>
122
+ </section>
123
+
124
+ <section data-section data-property="cross-references">
125
+ <h2 variant="section">See also</h2>
126
+ <ul>
127
+ <li><a href="/site/patterns/approvals">approvals</a> — the owner-side surface (13d). Access requests appear in the approval queue.</li>
128
+ <li><a href="/site/components/alert">alert-ui</a> — explanation copy on all three surfaces.</li>
129
+ <li><a href="/site/components/field">field-ui</a> · <a href="/site/components/select">select-ui</a> · <a href="/site/components/textarea">textarea-ui</a> — request form primitives.</li>
130
+ <li><a href="/site/patterns/permissions-role-picker">permissions-role-picker</a> — same role vocabulary as the role select.</li>
131
+ </ul>
132
+ </section>
@@ -0,0 +1,60 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en" theme="auto">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>Access requests (pattern) — AdiaUI</title>
7
+
8
+ <!-- Token base -->
9
+ <link rel="stylesheet" href="../../styles/resets.css">
10
+ <link rel="stylesheet" href="../../styles/tokens.css">
11
+
12
+ <!-- Component CSS — primitives this pattern composes -->
13
+ <link rel="stylesheet" href="../../components/alert/alert.css">
14
+ <link rel="stylesheet" href="../../components/button/button.css">
15
+ <link rel="stylesheet" href="../../components/card/card.css">
16
+ <link rel="stylesheet" href="../../components/col/col.css">
17
+ <link rel="stylesheet" href="../../components/field/field.css">
18
+ <link rel="stylesheet" href="../../components/input/input.css">
19
+ <link rel="stylesheet" href="../../components/select/select.css">
20
+ <link rel="stylesheet" href="../../components/tag/tag.css">
21
+ <link rel="stylesheet" href="../../components/text/text.css">
22
+ <link rel="stylesheet" href="../../components/textarea/textarea.css">
23
+
24
+ <!-- Component JS -->
25
+ <script type="module" src="../../components/alert/alert.js"></script>
26
+ <script type="module" src="../../components/button/button.js"></script>
27
+ <script type="module" src="../../components/card/card.js"></script>
28
+ <script type="module" src="../../components/col/col.js"></script>
29
+ <script type="module" src="../../components/field/field.js"></script>
30
+ <script type="module" src="../../components/input/input.js"></script>
31
+ <script type="module" src="../../components/select/select.js"></script>
32
+ <script type="module" src="../../components/tag/tag.js"></script>
33
+ <script type="module" src="../../components/text/text.js"></script>
34
+ <script type="module" src="../../components/textarea/textarea.js"></script>
35
+
36
+ <style>
37
+ :where(html, body) { margin: 0; min-height: 100vh; background: var(--md-sys-color-neutral-background); color: var(--md-sys-color-neutral-on-surface); font-family: var(--a-font-family); }
38
+ main { max-width: 960px; margin-inline: auto; padding: var(--a-space-6) var(--a-space-5); }
39
+ </style>
40
+ </head>
41
+ <body>
42
+
43
+ <main id="demo-root">
44
+ <p>Loading examples…</p>
45
+ </main>
46
+
47
+ <script type="module">
48
+ const root = document.getElementById('demo-root');
49
+ try {
50
+ const res = await fetch('./access-requests.examples.html');
51
+ if (!res.ok) throw new Error(`fetch failed (${res.status})`);
52
+ root.innerHTML = await res.text();
53
+ } catch (err) {
54
+ root.innerHTML = `<p style="color:var(--a-danger-strong);">Failed to load access-requests.examples.html — ${err.message}</p>`;
55
+ console.error('[access-requests.html]', err);
56
+ }
57
+ </script>
58
+
59
+ </body>
60
+ </html>
@@ -0,0 +1,236 @@
1
+ <header>
2
+ <div>
3
+ <h1>API keys, webhooks &amp; data export</h1>
4
+ <div data-actions>
5
+ <tag-ui size="sm">card-ui</tag-ui> <tag-ui size="sm">field-ui</tag-ui> <tag-ui size="sm">input-ui</tag-ui> <tag-ui size="sm">tag-ui</tag-ui> <tag-ui size="sm">button-ui</tag-ui> <tag-ui size="sm">alert-ui</tag-ui>
6
+ </div>
7
+ </div>
8
+ <p>Two adjacent admin surfaces: API key + webhook management (04g), and data-export / account-portability (04i). Both compose existing primitives — the patterns are in the wiring, the security copy, and the destructive-action flow.</p>
9
+ </header>
10
+
11
+ <section data-section data-property="when-to-use">
12
+ <h2 variant="section">When to use</h2>
13
+ <p data-note>
14
+ API keys: programmatic access to your account — server-side
15
+ integrations, scripts, CI. Distinct from per-user OAuth tokens
16
+ (account login flow); these are long-lived bearer tokens scoped
17
+ to a workspace. Webhooks deliver events to a URL.
18
+ Data export: GDPR / CCPA / SOC-2 compliance + workspace
19
+ migration. The user requests, the system queues, an email
20
+ arrives with a download link.
21
+ </p>
22
+ </section>
23
+
24
+ <section data-section data-property="api-keys-list">
25
+ <h2 variant="section">API keys list</h2>
26
+ <p data-note>The active-keys list. Each row carries a name, prefix (last 4 chars only — never the full secret), scope tag, last-used time, and a kebab menu (Rotate / Revoke). "Create key" header action.</p>
27
+ <div data-artifact-container>
28
+ <div data-artifact-item data-artifact-label="api keys list">
29
+ <card-ui data-chunk="api-keys-list">
30
+ <header>
31
+ <span slot="heading" variant="section">API keys</span>
32
+ <text-ui slot="description" color="subtle">3 active · last rotated 12 days ago</text-ui>
33
+ <button-ui slot="action" text="Create key" variant="primary" size="sm" icon-leading="plus"></button-ui>
34
+ </header>
35
+ <section bleed>
36
+ <list-ui divider contained>
37
+ <list-item-ui text="Production — backend">
38
+ <icon-ui slot="icon" name="key" size="sm"></icon-ui>
39
+ <span slot="description"><code>sk_live_…A4F2</code> · last used 4 minutes ago</span>
40
+ <row-ui slot="action" gap="2" align="center">
41
+ <tag-ui size="sm" variant="primary">read · write</tag-ui>
42
+ <button-ui icon="dots-three-vertical" variant="ghost" size="sm" aria-label="Manage"></button-ui>
43
+ </row-ui>
44
+ </list-item-ui>
45
+ <list-item-ui text="CI — read-only">
46
+ <icon-ui slot="icon" name="key" size="sm"></icon-ui>
47
+ <span slot="description"><code>sk_live_…9821</code> · last used 2 hours ago</span>
48
+ <row-ui slot="action" gap="2" align="center">
49
+ <tag-ui size="sm">read</tag-ui>
50
+ <button-ui icon="dots-three-vertical" variant="ghost" size="sm" aria-label="Manage"></button-ui>
51
+ </row-ui>
52
+ </list-item-ui>
53
+ <list-item-ui text="Local dev — kim">
54
+ <icon-ui slot="icon" name="key" size="sm"></icon-ui>
55
+ <span slot="description"><code>sk_test_…7f0e</code> · last used 18 days ago</span>
56
+ <row-ui slot="action" gap="2" align="center">
57
+ <tag-ui size="sm" variant="muted">test</tag-ui>
58
+ <button-ui icon="dots-three-vertical" variant="ghost" size="sm" aria-label="Manage"></button-ui>
59
+ </row-ui>
60
+ </list-item-ui>
61
+ </list-ui>
62
+ </section>
63
+ </card-ui>
64
+ </div>
65
+ </div>
66
+ </section>
67
+
68
+ <section data-section data-property="api-keys-create">
69
+ <h2 variant="section">Create key — one-time reveal</h2>
70
+ <p data-note>The just-created key shown once. After this view closes, the secret is not retrievable; only the prefix shows in the list. Copy button + alert explaining the one-shot semantics.</p>
71
+ <div data-artifact-container>
72
+ <div data-artifact-item data-artifact-label="key one-time reveal">
73
+ <card-ui data-chunk="api-keys-create" style="max-width: 560px;">
74
+ <header>
75
+ <span slot="heading" variant="section">Your new API key</span>
76
+ <text-ui slot="description" color="subtle">Copy it now — it won't be shown again</text-ui>
77
+ </header>
78
+ <section>
79
+ <col-ui gap="3">
80
+ <field-ui label="Production — backend">
81
+ <input-ui name="api_key" value="sk_live_4f8b2e7c91d2a48fA4F2" readonly icon-trailing="copy"></input-ui>
82
+ </field-ui>
83
+ <alert-ui variant="warning" icon="warning">
84
+ <col-ui slot="content" gap="0-5">
85
+ <text-ui strong>This is the only time we'll show this key.</text-ui>
86
+ <text-ui>Store it in your secrets manager now. If you lose it, you'll need to revoke this key and create a new one.</text-ui>
87
+ </col-ui>
88
+ </alert-ui>
89
+ </col-ui>
90
+ </section>
91
+ <footer divider>
92
+ <button-ui slot="action" text="I've stored it safely" variant="primary"></button-ui>
93
+ </footer>
94
+ </card-ui>
95
+ </div>
96
+ </div>
97
+ </section>
98
+
99
+ <section data-section data-property="webhooks-list">
100
+ <h2 variant="section">Webhooks list</h2>
101
+ <p data-note>Endpoints + the events they subscribe to + last delivery status. Failed deliveries surface as a danger tag with a "Retry" affordance per row.</p>
102
+ <div data-artifact-container>
103
+ <div data-artifact-item data-artifact-label="webhooks list">
104
+ <card-ui data-chunk="webhooks-list">
105
+ <header>
106
+ <span slot="heading" variant="section">Webhooks</span>
107
+ <text-ui slot="description" color="subtle">2 endpoints · 1 failing</text-ui>
108
+ <button-ui slot="action" text="Add endpoint" variant="primary" size="sm" icon-leading="plus"></button-ui>
109
+ </header>
110
+ <section bleed>
111
+ <list-ui divider contained>
112
+ <list-item-ui text="https://api.example.com/adia/events">
113
+ <icon-ui slot="icon" name="webhooks-logo" size="sm"></icon-ui>
114
+ <span slot="description">5 events · last delivery 3 minutes ago</span>
115
+ <row-ui slot="action" gap="2" align="center">
116
+ <tag-ui size="sm" variant="success">200 OK</tag-ui>
117
+ <button-ui icon="dots-three-vertical" variant="ghost" size="sm" aria-label="Manage"></button-ui>
118
+ </row-ui>
119
+ </list-item-ui>
120
+ <list-item-ui text="https://hooks.zapier.com/…/abc123/">
121
+ <icon-ui slot="icon" name="webhooks-logo" size="sm"></icon-ui>
122
+ <span slot="description">3 events · last attempt 2 hours ago · 3 retries</span>
123
+ <row-ui slot="action" gap="2" align="center">
124
+ <tag-ui size="sm" variant="danger">503</tag-ui>
125
+ <button-ui text="Retry" variant="ghost" size="sm"></button-ui>
126
+ <button-ui icon="dots-three-vertical" variant="ghost" size="sm" aria-label="Manage"></button-ui>
127
+ </row-ui>
128
+ </list-item-ui>
129
+ </list-ui>
130
+ </section>
131
+ </card-ui>
132
+ </div>
133
+ </div>
134
+ </section>
135
+
136
+ <section data-section data-property="data-export-request">
137
+ <h2 variant="section">Data export — request</h2>
138
+ <p data-note>Compliance / portability flow. User picks scope (full workspace vs. just my data) + format, the system queues the job, an email arrives with a download link. Async, not synchronous.</p>
139
+ <div data-artifact-container>
140
+ <div data-artifact-item data-artifact-label="data export request">
141
+ <card-ui data-chunk="data-export-request" style="max-width: 560px;">
142
+ <header>
143
+ <span slot="heading" variant="section">Export your data</span>
144
+ <text-ui slot="description" color="subtle">We'll email you when the archive is ready</text-ui>
145
+ </header>
146
+ <section>
147
+ <col-ui gap="3">
148
+ <field-ui label="What to include" required>
149
+ <select-ui name="scope">
150
+ <option value="self">Just my data (GDPR Article 15)</option>
151
+ <option value="workspace" selected>Entire workspace (admin only)</option>
152
+ </select-ui>
153
+ </field-ui>
154
+ <field-ui label="Format" required>
155
+ <select-ui name="format">
156
+ <option value="json" selected>JSON archive (.zip)</option>
157
+ <option value="ndjson">NDJSON (line-delimited)</option>
158
+ <option value="csv">CSV per table</option>
159
+ </select-ui>
160
+ </field-ui>
161
+ <alert-ui variant="info" icon="clock">
162
+ <col-ui slot="content" gap="0-5">
163
+ <text-ui strong>Exports are usually ready within 1 hour.</text-ui>
164
+ <text-ui>Large workspaces (≥ 1M records) can take up to 24 hours. We'll email <code>kim@example.com</code> with a download link valid for 7 days.</text-ui>
165
+ </col-ui>
166
+ </alert-ui>
167
+ </col-ui>
168
+ </section>
169
+ <footer divider>
170
+ <button-ui slot="action" text="Cancel" variant="ghost"></button-ui>
171
+ <button-ui slot="action" text="Request export" variant="primary"></button-ui>
172
+ </footer>
173
+ </card-ui>
174
+ </div>
175
+ </div>
176
+ </section>
177
+
178
+ <section data-section data-property="data-export-history">
179
+ <h2 variant="section">Export history</h2>
180
+ <p data-note>The user's recent export jobs. Status tags (Queued / Running / Ready / Expired). "Ready" rows show a Download button until the link expires; expired rows are still visible for audit but disabled.</p>
181
+ <div data-artifact-container>
182
+ <div data-artifact-item data-artifact-label="export history">
183
+ <card-ui data-chunk="data-export-history">
184
+ <header>
185
+ <span slot="heading" variant="section">Recent exports</span>
186
+ </header>
187
+ <section bleed>
188
+ <list-ui divider contained>
189
+ <list-item-ui text="Workspace · JSON">
190
+ <icon-ui slot="icon" name="download-simple" size="sm"></icon-ui>
191
+ <span slot="description">Requested 12 minutes ago · 1.2M records</span>
192
+ <tag-ui slot="action" size="sm" variant="warning">Running</tag-ui>
193
+ </list-item-ui>
194
+ <list-item-ui text="My data · CSV">
195
+ <icon-ui slot="icon" name="download-simple" size="sm"></icon-ui>
196
+ <span slot="description">Ready 2 hours ago · 4.2 MB · expires in 6 days</span>
197
+ <row-ui slot="action" gap="2" align="center">
198
+ <tag-ui size="sm" variant="success">Ready</tag-ui>
199
+ <button-ui text="Download" variant="primary" size="sm" icon-leading="download-simple"></button-ui>
200
+ </row-ui>
201
+ </list-item-ui>
202
+ <list-item-ui text="Workspace · JSON">
203
+ <icon-ui slot="icon" name="download-simple" size="sm"></icon-ui>
204
+ <span slot="description">Ready 14 days ago · link expired</span>
205
+ <tag-ui slot="action" size="sm" variant="muted">Expired</tag-ui>
206
+ </list-item-ui>
207
+ </list-ui>
208
+ </section>
209
+ </card-ui>
210
+ </div>
211
+ </div>
212
+ </section>
213
+
214
+ <section data-section data-property="composition">
215
+ <h2 variant="section">Composition rules</h2>
216
+ <ul>
217
+ <li><strong>Show the prefix, never the full key</strong> — the list view always renders <code>sk_live_…A4F2</code>. The full secret only ever appears in the one-time reveal card; if the user lost it, they have to revoke + recreate. Storing the full key in the DB plaintext is the smell this convention prevents.</li>
218
+ <li><strong>One-time reveal needs a confirmation gate</strong> — the "I've stored it safely" button is the user's acknowledgment that they grabbed the key. Closing the modal/page without clicking it should still hide the secret (security default).</li>
219
+ <li><strong>Webhook failures are first-class</strong> — a 503 tag + Retry button is the canonical row. Hiding failures in a sub-page guarantees they get ignored.</li>
220
+ <li><strong>Data export is async, not sync</strong> — never block the UI on a "Generate now" call. Queue the job; email the link. Users with 1M-record workspaces shouldn't see a spinner.</li>
221
+ <li><strong>Download links expire</strong> — 7 days is typical; longer for SOC-2 retention requirements. The UI shows the expiry and the "Expired" state retains audit visibility (don't delete the row).</li>
222
+ <li><strong>Scope selection is policy-aware</strong> — "Entire workspace" must be admin-gated; non-admins see only "Just my data" (GDPR Article 15). Don't show the option then 403 the request.</li>
223
+ <li><strong>Format choices match the consumer</strong> — JSON archive for re-import, NDJSON for streaming consumers, CSV for spreadsheets. Three is enough; PDF or XLSX adds support tickets without value.</li>
224
+ </ul>
225
+ </section>
226
+
227
+ <section data-section data-property="cross-references">
228
+ <h2 variant="section">See also</h2>
229
+ <ul>
230
+ <li><a href="/site/components/field">field-ui</a> · <a href="/site/components/input">input-ui</a> · <a href="/site/components/select">select-ui</a> — form primitives.</li>
231
+ <li><a href="/site/components/alert">alert-ui</a> — security + scheduling copy.</li>
232
+ <li><a href="/site/components/tag">tag-ui</a> — status (200 OK / 503 / Running / Ready / Expired).</li>
233
+ <li><a href="/site/patterns/permissions-sharing">permissions-sharing</a> — adjacent (API key scopes overlap with sharing scopes).</li>
234
+ <li><a href="/site/patterns/profile-public-and-verification">profile + verification</a> — adjacent (KYC also gates high-value API actions per 16e).</li>
235
+ </ul>
236
+ </section>