@vireo-ai/trellis-ui 0.1.30 → 0.1.32

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 (101) hide show
  1. package/package.json +1 -1
  2. package/packages/client/src/components/select/styles.css +4 -0
  3. package/packages/client/src/components/toast/styles.css +16 -74
  4. package/packages/client/src/styles/components.css +1 -0
  5. package/packages/client/src/styles/generated/theme-runtime.css +1 -4
  6. package/packages/client/src/styles/generated-sources.css +1 -1
  7. package/packages/client/src/styles/recipes/action.css +19 -109
  8. package/packages/client/src/styles/recipes/intent.css +101 -0
  9. package/packages/client/src/styles/theme.css +0 -11
  10. package/packages/client/types/runtime/cleanup-manager.d.ts +13 -0
  11. package/packages/client/types/runtime/engine/navigation.d.ts +6 -2
  12. package/packages/client/types/runtime/engine/request.d.ts +10 -3
  13. package/packages/client/types/runtime/engine/stream.d.ts +3 -11
  14. package/packages/client/types/styles/tailwind-candidates.d.ts +1 -0
  15. package/packages/server/trellis_ui/static/trellis_ui/assets/css/trellis.css +128 -185
  16. package/packages/server/trellis_ui/static/trellis_ui/assets/css/trellis.min.css +1 -1
  17. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/build-metadata.json +273 -272
  18. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/capabilities/motion.js +1 -1
  19. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/capabilities/sortable.js +1 -1
  20. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/alpine-data-CytyCyfk.js +2 -0
  21. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/alpine-data-CytyCyfk.js.map +1 -0
  22. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{capability-motion-wMoceguq.js → capability-motion-ikQPX2KS.js} +2 -2
  23. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{capability-motion-wMoceguq.js.map → capability-motion-ikQPX2KS.js.map} +1 -1
  24. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{capability-sortable-BurX5yRd.js → capability-sortable-_n-Bn6OZ.js} +3 -3
  25. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{capability-sortable-BurX5yRd.js.map → capability-sortable-_n-Bn6OZ.js.map} +1 -1
  26. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/core-DsBVeiBn.js +2 -0
  27. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/core-DsBVeiBn.js.map +1 -0
  28. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-DRqap77P.js → entry.generated-B654Bqgy.js} +2 -2
  29. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-DRqap77P.js.map → entry.generated-B654Bqgy.js.map} +1 -1
  30. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-BehM6Hle.js → entry.generated-BC8JUf6f.js} +2 -2
  31. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-BehM6Hle.js.map → entry.generated-BC8JUf6f.js.map} +1 -1
  32. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-C-MH09sf.js → entry.generated-BgxTv7ov.js} +2 -2
  33. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-C-MH09sf.js.map → entry.generated-BgxTv7ov.js.map} +1 -1
  34. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-CM26DIxy.js +2 -0
  35. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-C3h9Czzn.js.map → entry.generated-CM26DIxy.js.map} +1 -1
  36. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-CoJxfxlc.js → entry.generated-CPbvsglm.js} +2 -2
  37. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-CoJxfxlc.js.map → entry.generated-CPbvsglm.js.map} +1 -1
  38. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-C5Bueyfb.js → entry.generated-CaBUZe9u.js} +2 -2
  39. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-C5Bueyfb.js.map → entry.generated-CaBUZe9u.js.map} +1 -1
  40. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-D6cdmqiV.js → entry.generated-Ch-bdMyP.js} +2 -2
  41. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-D6cdmqiV.js.map → entry.generated-Ch-bdMyP.js.map} +1 -1
  42. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-DBSwLHmm.js → entry.generated-D5gXHQl_.js} +2 -2
  43. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-DBSwLHmm.js.map → entry.generated-D5gXHQl_.js.map} +1 -1
  44. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-CCka3fIO.js → entry.generated-DBmmM-XT.js} +2 -2
  45. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-CCka3fIO.js.map → entry.generated-DBmmM-XT.js.map} +1 -1
  46. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-CSxEK8G9.js → entry.generated-DIPrCNjK.js} +2 -2
  47. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-CSxEK8G9.js.map → entry.generated-DIPrCNjK.js.map} +1 -1
  48. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-DXWS-S4C.js +2 -0
  49. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-DXWS-S4C.js.map +1 -0
  50. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-cMueWbY7.js → entry.generated-DYBALnuF.js} +2 -2
  51. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-cMueWbY7.js.map → entry.generated-DYBALnuF.js.map} +1 -1
  52. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-DEiL4FhC.js → entry.generated-DfuZKFMG.js} +2 -2
  53. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-DEiL4FhC.js.map → entry.generated-DfuZKFMG.js.map} +1 -1
  54. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-EtCfrZfr.js → entry.generated-Dgrr543E.js} +2 -2
  55. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-EtCfrZfr.js.map → entry.generated-Dgrr543E.js.map} +1 -1
  56. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-9sxiaVVI.js → entry.generated-DhtIfdSe.js} +2 -2
  57. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-9sxiaVVI.js.map → entry.generated-DhtIfdSe.js.map} +1 -1
  58. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-Dzw2Rg5F.js → entry.generated-DkHtVCQf.js} +2 -2
  59. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-Dzw2Rg5F.js.map → entry.generated-DkHtVCQf.js.map} +1 -1
  60. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-BuXeU4zt.js → entry.generated-WUm64hMS.js} +2 -2
  61. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-BuXeU4zt.js.map → entry.generated-WUm64hMS.js.map} +1 -1
  62. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{motion-BRaHJwNf.js → motion-D8nzvbpd.js} +3 -3
  63. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{motion-BRaHJwNf.js.map → motion-D8nzvbpd.js.map} +1 -1
  64. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/stream-DVqpCtdQ.js +4 -0
  65. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/stream-DVqpCtdQ.js.map +1 -0
  66. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/ui-ZuNy_Awl.js +2 -0
  67. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/ui-ZuNy_Awl.js.map +1 -0
  68. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/accordion.js +1 -1
  69. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/checkbox.js +1 -1
  70. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/date-picker.js +1 -1
  71. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/dropdown.js +1 -1
  72. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/field.js +1 -1
  73. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/file-upload.js +1 -1
  74. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/index.js +1 -1
  75. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/input.js +1 -1
  76. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/modal.js +1 -1
  77. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/panels.js +1 -1
  78. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/radio.js +1 -1
  79. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/scroll-area.js +1 -1
  80. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/select.js +1 -1
  81. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/sidebar.js +1 -1
  82. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/slider.js +1 -1
  83. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/switch.js +1 -1
  84. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/tabs.js +1 -1
  85. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/toast.js +1 -1
  86. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/core.js +1 -1
  87. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/index.js +1 -1
  88. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/logical-entry-manifest.json +128 -128
  89. package/packages/server/trellis_ui/static/trellis_ui/assets/js/trellis.js +8 -8
  90. package/packages/server/trellis_ui/static/trellis_ui/assets/js/trellis.min.js +8 -8
  91. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/alpine-data-DZ17j0jc.js +0 -2
  92. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/alpine-data-DZ17j0jc.js.map +0 -1
  93. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/core-BuKz1uWk.js +0 -2
  94. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/core-BuKz1uWk.js.map +0 -1
  95. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-BqOi_tIN.js +0 -2
  96. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-BqOi_tIN.js.map +0 -1
  97. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-C3h9Czzn.js +0 -2
  98. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/stream-pMBGbBZH.js +0 -4
  99. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/stream-pMBGbBZH.js.map +0 -1
  100. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/ui-H3t7UHMs.js +0 -2
  101. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/ui-H3t7UHMs.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"ui-H3t7UHMs.js","names":[],"sources":["../../../../../../../../client/src/runtime/identity.ts","../../../../../../../../client/src/runtime/layout-participant.ts","../../../../../../../../client/src/utils/warn.ts","../../../../../../../../client/src/runtime/dom-invalidation.ts","../../../../../../../../client/src/runtime/morph.ts","../../../../../../../../client/src/runtime/engine/request.ts","../../../../../../../../client/src/runtime/ui.ts"],"sourcesContent":["const STABLE_KEY_ATTR = 'data-ui-key';\n\nconst stableIdentity = (element: Element, explicit?: unknown): string | null => {\n if (typeof explicit === 'string' && explicit) return explicit;\n return element.getAttribute(STABLE_KEY_ATTR) || element.id || null;\n};\n\nexport {STABLE_KEY_ATTR, stableIdentity};\n","import {stableIdentity} from './identity';\n\ntype LayoutScope = Element | Document | string | Iterable<Element>;\n\nconst MOTION_KEY_ATTR = 'data-ui-motion-key';\nconst MOTION_LAYOUT_ATTR = 'data-ui-motion-layout';\n\nconst isIterable = (value: unknown): value is Iterable<Element> => (\n typeof value === 'object'\n && value !== null\n && Symbol.iterator in value\n);\n\nconst scopeRoots = (scope: LayoutScope = document): Array<Element | Document> => {\n if (typeof scope === 'string') return Array.from(document.querySelectorAll(scope));\n if (scope instanceof Document || scope instanceof Element) return [scope];\n if (isIterable(scope)) return Array.from(scope);\n return [document];\n};\n\nconst markLayoutParticipant = (\n scope: LayoutScope = document,\n options: {key?: string; layout?: boolean} = {},\n): (() => void) => {\n const elements = scopeRoots(scope).filter((root): root is Element => root instanceof Element);\n const changed: Array<{element: Element; attr: string; previous: string | null}> = [];\n const setTemporaryAttr = (element: Element, attr: string, value: string): void => {\n changed.push({element, attr, previous: element.getAttribute(attr)});\n element.setAttribute(attr, value);\n };\n\n elements.forEach((element) => {\n if (options.layout ?? true) setTemporaryAttr(element, MOTION_LAYOUT_ATTR, '');\n const identity = stableIdentity(element, options.key);\n if (identity && !element.hasAttribute(MOTION_KEY_ATTR)) {\n setTemporaryAttr(element, MOTION_KEY_ATTR, identity);\n }\n });\n\n return () => {\n changed.reverse().forEach(({element, attr, previous}) => {\n if (previous === null) {\n element.removeAttribute(attr);\n return;\n }\n element.setAttribute(attr, previous);\n });\n };\n};\n\nexport {MOTION_KEY_ATTR, MOTION_LAYOUT_ATTR, markLayoutParticipant};\nexport type {LayoutScope};\n","const warn = (message: string, ...args: unknown[]): void => {\n if (typeof console !== 'undefined') console.warn(message, ...args);\n};\n\nexport {warn};\n","type DomInvalidationOwner = Readonly<{\n invalidateDom(): void;\n}>;\n\nconst owners = new WeakMap<Element, Set<DomInvalidationOwner>>();\n\nconst registerDomInvalidationOwner = (\n element: Element,\n owner: DomInvalidationOwner,\n): (() => void) => {\n const elementOwners = owners.get(element) ?? new Set<DomInvalidationOwner>();\n elementOwners.add(owner);\n owners.set(element, elementOwners);\n return () => {\n elementOwners.delete(owner);\n if (elementOwners.size === 0) owners.delete(element);\n };\n};\n\nconst findClosestDomInvalidationOwners = (element: Element): readonly DomInvalidationOwner[] => {\n let current: Element | null = element;\n while (current) {\n const elementOwners = owners.get(current);\n if (elementOwners?.size) return Array.from(elementOwners);\n current = current.parentElement;\n }\n return [];\n};\n\nexport {findClosestDomInvalidationOwners, registerDomInvalidationOwner};\nexport type {DomInvalidationOwner};\n","const PRESERVE_MORPH_ATTRIBUTES = 'data-ui-preserve-attr';\n\nconst declareMorphAttributes = (element: Element, ...names: string[]): void => {\n const declared = new Set(\n (element.getAttribute(PRESERVE_MORPH_ATTRIBUTES) ?? '')\n .split(/\\s+/)\n .filter(Boolean),\n );\n names.filter(Boolean).forEach((name) => declared.add(name));\n if (declared.size > 0) {\n element.setAttribute(PRESERVE_MORPH_ATTRIBUTES, Array.from(declared).join(' '));\n }\n};\n\nconst preserveDeclaredMorphAttributes = (from: Node, to: Node): void => {\n if (!(from instanceof Element) || !(to instanceof Element)) return;\n const preserved = new Set([\n ...(from.getAttribute(PRESERVE_MORPH_ATTRIBUTES) ?? '').split(/\\s+/),\n ...(to.getAttribute(PRESERVE_MORPH_ATTRIBUTES) ?? '').split(/\\s+/),\n ].filter(Boolean));\n if (preserved.size === 0) return;\n to.setAttribute(PRESERVE_MORPH_ATTRIBUTES, Array.from(preserved).join(' '));\n\n for (const name of preserved) {\n if (from.hasAttribute(name)) {\n to.setAttribute(name, from.getAttribute(name) ?? '');\n } else {\n to.removeAttribute(name);\n }\n }\n};\n\nexport {\n PRESERVE_MORPH_ATTRIBUTES,\n declareMorphAttributes,\n preserveDeclaredMorphAttributes,\n};\n","import type Alpine from 'alpinejs';\nimport type {StreamAlpine} from './stream';\nimport {warn} from '../../utils';\n\ntype RequestMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\ntype RequestData = FormData | URLSearchParams | HTMLFormElement | Record<string, unknown> | string | Blob | ArrayBuffer;\ntype RequestExtra = Record<string, unknown> | FormData | URLSearchParams;\ntype RequestSource = Element;\n\ntype RequestOptions = {\n method?: RequestMethod | Lowercase<RequestMethod>;\n cache?: RequestCache;\n data?: RequestData;\n extra?: RequestExtra;\n headers?: HeadersInit;\n requestId?: string;\n signal?: AbortSignal;\n source?: RequestSource;\n submitter?: HTMLElement | null;\n};\n\ntype PreparedRequest = {\n url: URL;\n method: RequestMethod;\n init: RequestInit;\n};\n\ntype RequestResult = {\n requestId: string;\n response: Response | null;\n type: 'empty' | 'redirect' | 'other' | 'aborted' | 'cancelled' | 'unavailable';\n};\n\ntype RequestLifecycleDetail = {\n source: Element | Document;\n url: string;\n method: RequestMethod;\n requestInit: RequestInit;\n requestId: string;\n response?: Response | null;\n responseType?: RequestResult['type'];\n error?: unknown;\n controller: AbortController;\n signal: AbortSignal;\n};\n\ntype BoundAbortSignal = {\n signal: AbortSignal;\n cleanup(): void;\n};\n\nconst REQUEST_HEADER = 'X-Trellis-UI-Request';\nconst CLIENT_SESSION_HEADER = 'X-Trellis-Client';\nconst REQUEST_ID_HEADER = 'X-Trellis-Request-ID';\nconst CLIENT_STREAM_SELECTOR = '[data-ui-stream][data-ui-stream-client]';\nconst CLIENT_STREAM_OPEN_EVENT = 'ui:stream:open';\nconst CLIENT_STREAM_ERROR_EVENT = 'ui:stream:error';\nconst CLIENT_STREAM_DISCONNECTED_EVENT = 'ui:stream:disconnected';\nconst CLIENT_STREAM_REFRESH_EVENT = 'ui:stream:refresh';\nconst CSRF_META_SELECTOR = 'meta[name=\"csrf-token\"]';\nconst SSE_CONTENT_TYPE = 'text/event-stream';\nconst PENDING_ATTRIBUTE = 'data-ui-request-pending';\nconst FORM_URL_ENCODED = 'application/x-www-form-urlencoded';\nconst FORM_MULTIPART = 'multipart/form-data';\n// GET is the only bodyless helper. DELETE remains body-capable for API symmetry;\n// Django apps may still prefer POST intents or URL-specific delete routes.\nconst METHODS_WITHOUT_BODY = new Set<RequestMethod>(['GET']);\n\nlet AlpineRuntime: StreamAlpine | null = null;\n\nconst normalizeMethod = (method: string | null | undefined): RequestMethod => {\n const value = (method || 'GET').toUpperCase();\n if (value === 'POST' || value === 'PUT' || value === 'PATCH' || value === 'DELETE') return value;\n return 'GET';\n};\n\nconst appendEntry = (target: FormData | URLSearchParams, key: string, value: string | Blob): void => {\n if (target instanceof FormData) {\n target.append(key, value);\n return;\n }\n target.append(key, value instanceof File ? value.name : String(value));\n};\n\nconst addValue = (target: FormData | URLSearchParams, key: string, value: unknown): void => {\n if (Array.isArray(value)) {\n value.forEach((item) => addValue(target, key, item));\n return;\n }\n if (value === undefined || value === null) return;\n appendEntry(target, key, value instanceof Blob ? value : String(value));\n};\n\nconst appendRecord = (target: FormData | URLSearchParams, record: Record<string, unknown>): void => {\n Object.entries(record).forEach(([key, value]) => addValue(target, key, value));\n};\n\nconst appendExtra = (target: FormData | URLSearchParams, extra: RequestExtra | undefined): void => {\n if (!extra) return;\n if (extra instanceof FormData || extra instanceof URLSearchParams) {\n for (const [key, value] of extra.entries()) appendEntry(target, key, value);\n return;\n }\n appendRecord(target, extra);\n};\n\nconst headersWithDefaults = (headersInit: HeadersInit | undefined, body: BodyInit | null): Headers => {\n const headers = new Headers(headersInit);\n headers.set(REQUEST_HEADER, 'true');\n\n const csrf = document.querySelector<HTMLMetaElement>(CSRF_META_SELECTOR)?.content;\n if (csrf) headers.set('X-CSRFToken', csrf);\n\n if (body instanceof URLSearchParams && !headers.has('Content-Type')) {\n headers.set('Content-Type', FORM_URL_ENCODED);\n }\n\n return headers;\n};\n\nconst urlFor = (url: string | URL | undefined, source: RequestSource | undefined, submitter: HTMLElement | null): URL => {\n if (url) return new URL(url, document.baseURI);\n\n if (source instanceof HTMLFormElement) {\n const action = submitter?.getAttribute('formaction') || source.getAttribute('action') || window.location.href;\n return new URL(action, document.baseURI);\n }\n\n if (source instanceof HTMLAnchorElement) return new URL(source.href, document.baseURI);\n\n return new URL(window.location.href);\n};\n\nconst formEnctype = (form: HTMLFormElement, submitter: HTMLElement | null): string => (\n submitter?.getAttribute('formenctype') || form.enctype || FORM_URL_ENCODED\n);\n\nconst submitterNameValue = (submitter: HTMLElement | null): [string, string] | null => {\n if (!(submitter instanceof HTMLButtonElement || submitter instanceof HTMLInputElement)) return null;\n const name = submitter.getAttribute('name');\n if (!name) return null;\n return [name, submitter.value];\n};\n\nconst formPayload = (form: HTMLFormElement, submitter: HTMLElement | null): FormData => {\n const payload = new FormData(form);\n const pair = submitterNameValue(submitter);\n if (pair) payload.append(...pair);\n return payload;\n};\n\nconst paramsFrom = (payload: FormData | URLSearchParams): URLSearchParams => {\n const params = new URLSearchParams();\n for (const [key, value] of payload.entries()) {\n if (value instanceof File) {\n params.append(key, value.name);\n } else {\n params.append(key, value);\n }\n }\n return params;\n};\n\nconst payloadFromData = (data: RequestData | undefined, natural: FormData | URLSearchParams): {payload: FormData | URLSearchParams | BodyInit | null; explicit: boolean} => {\n if (data === undefined) return {payload: natural, explicit: false};\n if (data instanceof HTMLFormElement) return {payload: new FormData(data), explicit: true};\n if (data instanceof FormData || data instanceof URLSearchParams || typeof data === 'string' || data instanceof Blob || data instanceof ArrayBuffer) {\n return {payload: data, explicit: true};\n }\n const params = new URLSearchParams();\n appendRecord(params, data);\n return {payload: params, explicit: true};\n};\n\nconst mergePayload = (\n payload: FormData | URLSearchParams | BodyInit | null,\n extra: RequestExtra | undefined,\n): FormData | URLSearchParams | BodyInit | null => {\n if (!extra) return payload;\n\n if (payload instanceof FormData || payload instanceof URLSearchParams) {\n appendExtra(payload, extra);\n return payload;\n }\n\n const params = new URLSearchParams();\n if (typeof payload === 'string') params.append('data', payload);\n appendExtra(params, extra);\n return params;\n};\n\nconst naturalPayload = (\n source: RequestSource | undefined,\n submitter: HTMLElement | null,\n): {payload: FormData | URLSearchParams; enctype: string} => {\n if (source instanceof HTMLFormElement) {\n return {\n payload: formPayload(source, submitter),\n enctype: formEnctype(source, submitter),\n };\n }\n return {payload: new URLSearchParams(), enctype: FORM_URL_ENCODED};\n};\n\nconst resolveMethod = (source: RequestSource | undefined, optionMethod: string | undefined, submitter: HTMLElement | null): RequestMethod => {\n if (optionMethod) return normalizeMethod(optionMethod);\n if (source instanceof HTMLFormElement) {\n return normalizeMethod(submitter?.getAttribute('formmethod') || source.getAttribute('method'));\n }\n return 'GET';\n};\n\nconst prepareRequest = (url: string | URL | undefined, options: RequestOptions = {}): PreparedRequest => {\n const source = options.source;\n const submitter = options.submitter ?? null;\n const method = resolveMethod(source, options.method, submitter);\n const resolvedUrl = urlFor(url, source, submitter);\n const natural = naturalPayload(source, submitter);\n const basePayload = payloadFromData(options.data, natural.payload);\n const payload = mergePayload(basePayload.payload, options.extra);\n\n const init: RequestInit = {\n method,\n ...(options.cache ? {cache: options.cache} : {}),\n };\n let body: BodyInit | null = null;\n\n if (METHODS_WITHOUT_BODY.has(method)) {\n if (payload instanceof FormData || payload instanceof URLSearchParams) {\n paramsFrom(payload).forEach((value, key) => resolvedUrl.searchParams.append(key, value));\n } else if (typeof payload === 'string') {\n resolvedUrl.searchParams.append('data', payload);\n }\n } else if (payload instanceof FormData && (basePayload.explicit || natural.enctype === FORM_MULTIPART)) {\n body = payload;\n } else if (payload instanceof FormData) {\n body = paramsFrom(payload);\n } else {\n body = payload;\n }\n\n init.headers = headersWithDefaults(options.headers, body);\n if (body !== null && body !== undefined) init.body = body;\n\n return {url: resolvedUrl, method, init};\n};\n\nconst eventTargetFor = (source: Element | undefined): Element | Document => (\n source?.isConnected ? source : document\n);\n\nconst lifecycleEvent = (\n name: string,\n detail: RequestLifecycleDetail,\n options: {cancelable?: boolean} = {},\n): CustomEvent<RequestLifecycleDetail> => new CustomEvent<RequestLifecycleDetail>(name, {\n bubbles: true,\n composed: true,\n cancelable: options.cancelable ?? false,\n detail,\n});\n\nconst dispatchLifecycle = (name: string, source: Element | undefined, detail: RequestLifecycleDetail, options?: {cancelable?: boolean}): boolean => (\n eventTargetFor(source).dispatchEvent(lifecycleEvent(name, detail, options))\n);\n\nconst pendingCounts = new WeakMap<Element, number>();\n\nconst setPending = (source: Element | undefined): void => {\n if (!source) return;\n const count = pendingCounts.get(source) ?? 0;\n pendingCounts.set(source, count + 1);\n source.setAttribute('aria-busy', 'true');\n source.setAttribute(PENDING_ATTRIBUTE, 'true');\n};\n\nconst clearPending = (source: Element | undefined): void => {\n if (!source) return;\n const nextCount = (pendingCounts.get(source) ?? 1) - 1;\n if (nextCount > 0) {\n pendingCounts.set(source, nextCount);\n return;\n }\n pendingCounts.delete(source);\n source.removeAttribute('aria-busy');\n source.removeAttribute(PENDING_ATTRIBUTE);\n};\n\nconst isSseResponse = (response: Response): boolean => (\n response.headers.get('Content-Type')?.toLowerCase().includes(SSE_CONTENT_TYPE) ?? false\n);\n\nconst handleResponse = async (response: Response): Promise<Omit<RequestResult, 'requestId'>> => {\n if (\n response.status === 204\n || response.body === null\n || response.headers.get('X-Trellis-UI-Response') === 'empty'\n ) return {response, type: 'empty'};\n\n if (response.redirected && !isSseResponse(response)) {\n window.location.assign(response.url);\n return {response, type: 'redirect'};\n }\n\n warn('x-ui-request: expected an empty response', response);\n return {response, type: 'other'};\n};\n\ntype ClientStreamReady = {token: string} | null;\nconst streamReadiness = new WeakMap<HTMLElement, Promise<ClientStreamReady>>();\n\nconst streamClientToken = (stream: HTMLElement): string | null => {\n const token = stream.dataset.uiStreamClient;\n const expiresAt = Number(stream.dataset.uiStreamClientExpires);\n if (!token) return null;\n if (Number.isFinite(expiresAt) && expiresAt > 0 && expiresAt <= Date.now()) return null;\n return token;\n};\n\nconst readyClientStream = (): ClientStreamReady => {\n const stream = document.querySelector<HTMLElement>(CLIENT_STREAM_SELECTOR);\n const token = stream ? streamClientToken(stream) : null;\n if (!stream || !token || stream.dataset.uiStreamState !== 'open') return null;\n return {token};\n};\n\nconst streamTimeout = (stream: HTMLElement): number => {\n const configured = Number(stream.dataset.uiStreamTimeout);\n return Number.isFinite(configured) && configured >= 0 ? configured : 5000;\n};\n\nconst waitForClientStream = (signal: AbortSignal): Promise<ClientStreamReady> => {\n const stream = document.querySelector<HTMLElement>(CLIENT_STREAM_SELECTOR);\n const token = stream ? streamClientToken(stream) : null;\n if (!stream) return Promise.resolve(null);\n if (token && stream.dataset.uiStreamState === 'open') return Promise.resolve({token});\n if (\n stream.dataset.uiStreamState === 'error'\n || stream.dataset.uiStreamState === 'disconnected'\n || signal.aborted\n ) return Promise.resolve(null);\n\n const existingReadiness = streamReadiness.get(stream);\n const readiness: Promise<ClientStreamReady> = existingReadiness ?? new Promise<ClientStreamReady>((resolve) => {\n const finish = (value: ClientStreamReady): void => {\n window.clearTimeout(timeoutId);\n stream.removeEventListener(CLIENT_STREAM_OPEN_EVENT, onOpen);\n stream.removeEventListener(CLIENT_STREAM_ERROR_EVENT, onError);\n stream.removeEventListener(CLIENT_STREAM_DISCONNECTED_EVENT, onError);\n resolve(value);\n };\n const onOpen = (): void => {\n const currentToken = streamClientToken(stream);\n finish(currentToken ? {token: currentToken} : null);\n };\n const onError = (): void => finish(null);\n const timeoutId = window.setTimeout(onError, streamTimeout(stream));\n\n stream.addEventListener(CLIENT_STREAM_OPEN_EVENT, onOpen, {once: true});\n stream.addEventListener(CLIENT_STREAM_ERROR_EVENT, onError, {once: true});\n stream.addEventListener(CLIENT_STREAM_DISCONNECTED_EVENT, onError, {once: true});\n }).finally(() => {\n streamReadiness.delete(stream);\n });\n if (!existingReadiness) streamReadiness.set(stream, readiness);\n\n return new Promise((resolve) => {\n const onAbort = (): void => resolve(null);\n signal.addEventListener('abort', onAbort, {once: true});\n void readiness.then((result) => {\n signal.removeEventListener('abort', onAbort);\n resolve(result);\n });\n });\n};\n\nconst prepareClientStream = async (signal: AbortSignal): Promise<ClientStreamReady> => {\n const ready = readyClientStream();\n if (ready) return ready;\n\n const stream = document.querySelector<HTMLElement>(CLIENT_STREAM_SELECTOR);\n if (!stream) return null;\n if (!streamClientToken(stream)) {\n stream.dispatchEvent(new CustomEvent(CLIENT_STREAM_REFRESH_EVENT));\n const refreshed = readyClientStream();\n if (refreshed) return refreshed;\n }\n return waitForClientStream(signal);\n};\n\nconst bindExternalAbort = (controller: AbortController, externalSignal: AbortSignal | undefined): BoundAbortSignal => {\n if (!externalSignal) {\n return {\n signal: controller.signal,\n cleanup: () => undefined,\n };\n }\n\n const abort = (): void => controller.abort(externalSignal.reason);\n if (externalSignal.aborted) {\n abort();\n } else {\n externalSignal.addEventListener('abort', abort, {once: true});\n }\n\n return {\n signal: controller.signal,\n cleanup: () => externalSignal.removeEventListener('abort', abort),\n };\n};\n\nconst isAbortError = (error: unknown, signal: AbortSignal): boolean => (\n signal.aborted\n || (error instanceof DOMException && error.name === 'AbortError')\n || (error instanceof Error && error.name === 'AbortError')\n);\n\nconst requestWithAlpine = async (\n AlpineInstance: StreamAlpine,\n url: string | URL | undefined,\n options: RequestOptions = {},\n): Promise<RequestResult> => {\n const source = options.source;\n const controller = new AbortController();\n const requestId = options.requestId ?? crypto.randomUUID();\n const prepared = prepareRequest(url, options);\n const boundAbort = bindExternalAbort(controller, options.signal);\n const signal = boundAbort.signal;\n prepared.init.signal = signal;\n (prepared.init.headers as Headers).set(REQUEST_ID_HEADER, requestId);\n const clientStream = readyClientStream() ?? await prepareClientStream(signal);\n if (signal.aborted) {\n boundAbort.cleanup();\n return {requestId, response: null, type: 'aborted'};\n }\n if (!clientStream) {\n boundAbort.cleanup();\n return {requestId, response: null, type: signal.aborted ? 'aborted' : 'unavailable'};\n }\n (prepared.init.headers as Headers).set(CLIENT_SESSION_HEADER, clientStream.token);\n\n const detail: RequestLifecycleDetail = {\n source: source ?? document,\n url: prepared.url.toString(),\n method: prepared.method,\n requestInit: prepared.init,\n requestId,\n controller,\n signal,\n };\n\n if (!dispatchLifecycle('ui:request:before', source, detail, {cancelable: true})) {\n boundAbort.cleanup();\n return {requestId, response: null, type: 'cancelled'};\n }\n\n setPending(source);\n dispatchLifecycle('ui:request:start', source, detail);\n\n try {\n const response = await fetch(prepared.url.toString(), prepared.init);\n const result = await handleResponse(response);\n detail.response = response;\n detail.responseType = result.type;\n\n if ((response.ok && result.type !== 'other') || result.type === 'redirect') {\n dispatchLifecycle('ui:request:success', source, detail);\n } else {\n dispatchLifecycle('ui:request:error', source, detail);\n }\n\n return {...result, requestId};\n } catch (error) {\n if (isAbortError(error, signal)) {\n detail.responseType = 'aborted';\n return {requestId, response: null, type: 'aborted'};\n }\n\n detail.error = error;\n dispatchLifecycle('ui:request:error', source, detail);\n throw error;\n } finally {\n boundAbort.cleanup();\n clearPending(source);\n dispatchLifecycle('ui:request:finish', source, detail);\n }\n};\n\nconst requireAlpine = (): StreamAlpine => {\n if (!AlpineRuntime) {\n throw new Error('Trellis request runtime has not been registered with Alpine.');\n }\n return AlpineRuntime;\n};\n\nconst request = (url: string | URL, options: RequestOptions = {}): Promise<RequestResult> => (\n requestWithAlpine(requireAlpine(), url, options)\n);\n\nconst get = (url: string | URL, options: RequestOptions = {}): Promise<RequestResult> => (\n request(url, {...options, method: 'GET'})\n);\n\nconst post = (url: string | URL, options: RequestOptions = {}): Promise<RequestResult> => (\n request(url, {...options, method: 'POST'})\n);\n\nconst put = (url: string | URL, options: RequestOptions = {}): Promise<RequestResult> => (\n request(url, {...options, method: 'PUT'})\n);\n\nconst del = (url: string | URL, options: RequestOptions = {}): Promise<RequestResult> => (\n request(url, {...options, method: 'DELETE'})\n);\n\nconst registerRequestRuntime = (AlpineInstance: Alpine.Alpine | StreamAlpine): void => {\n AlpineRuntime = AlpineInstance as StreamAlpine;\n};\n\nexport {\n del,\n get,\n post,\n put,\n registerRequestRuntime,\n request,\n requestWithAlpine,\n};\nexport type {RequestLifecycleDetail, RequestMethod, RequestOptions, RequestResult};\n","import type Alpine from 'alpinejs';\nimport type {motion} from '../motion';\nimport {del, get, post, put} from './engine/request';\nimport type {sortable, UiSortableService} from './drag-and-drop/sortable';\n\ntype UiState = {\n activeRequests: number;\n};\n\ntype UiRuntime = {\n readonly delete: typeof del;\n readonly get: typeof get;\n readonly post: typeof post;\n readonly put: typeof put;\n readonly isFetching: boolean;\n readonly motion: typeof motion;\n readonly sortable: UiSortableService;\n};\ntype UiCapabilities = {\n motion?: typeof motion;\n sortable?: typeof sortable;\n};\n\nlet state: UiState = {activeRequests: 0};\nlet reactive = false;\nlet listening = false;\nlet capabilities: UiCapabilities = {};\n\nconst ui: UiRuntime = {\n get,\n post,\n put,\n delete: del,\n get motion(): typeof motion {\n if (!capabilities.motion) throw new Error('Trellis Motion capability is not registered.');\n return capabilities.motion;\n },\n get sortable(): UiSortableService {\n if (!capabilities.sortable) throw new Error('Trellis Sortable capability is not registered.');\n return capabilities.sortable;\n },\n get isFetching(): boolean {\n return state.activeRequests > 0;\n },\n};\n\nconst registerRequestState = (): void => {\n if (listening) return;\n listening = true;\n\n document.addEventListener('ui:request:start', () => {\n state.activeRequests += 1;\n });\n document.addEventListener('ui:request:finish', () => {\n state.activeRequests = Math.max(0, state.activeRequests - 1);\n });\n};\n\nconst registerUiMagic = (AlpineInstance: Alpine.Alpine): void => {\n if (!reactive) {\n state = AlpineInstance.reactive(state);\n reactive = true;\n }\n registerRequestState();\n AlpineInstance.magic('ui', () => ui);\n};\nconst registerUiMotion = (value: typeof motion): void => {\n capabilities.motion = value;\n};\nconst registerUiSortable = (value: typeof sortable): void => {\n capabilities.sortable = value;\n};\n\nexport {registerUiMagic, registerUiMotion, registerUiSortable, ui};\nexport type {UiCapabilities, UiRuntime};\n"],"mappings":"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"}