@kedem/okdb 1.0.0

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 (260) hide show
  1. package/LICENSE +57 -0
  2. package/README.md +344 -0
  3. package/banner.jpg +0 -0
  4. package/bin/okdb.js +2 -0
  5. package/docs/OKDB-ARCHITECTURE.md +1036 -0
  6. package/docs/auth-and-sync.md +558 -0
  7. package/docs/auth-permissions.md +143 -0
  8. package/docs/change-log.md +169 -0
  9. package/docs/data-model.md +174 -0
  10. package/docs/embeddings.md +338 -0
  11. package/docs/files.md +131 -0
  12. package/docs/fts.md +139 -0
  13. package/docs/functions.md +514 -0
  14. package/docs/getting-started.md +233 -0
  15. package/docs/http-api.md +705 -0
  16. package/docs/index.md +115 -0
  17. package/docs/indexes.md +207 -0
  18. package/docs/logging.md +116 -0
  19. package/docs/manifest.json +38 -0
  20. package/docs/migration.md +154 -0
  21. package/docs/pipelines.md +598 -0
  22. package/docs/plugins.md +144 -0
  23. package/docs/querying.md +204 -0
  24. package/docs/queue.md +637 -0
  25. package/docs/sync.md +156 -0
  26. package/docs/transactions.md +140 -0
  27. package/docs/ttl.md +375 -0
  28. package/okdb.js +1 -0
  29. package/package.json +26 -0
  30. package/public/admin-app.js +1 -0
  31. package/public/android-chrome-192x192.png +0 -0
  32. package/public/android-chrome-512x512.png +0 -0
  33. package/public/apple-touch-icon.png +0 -0
  34. package/public/components/admin-route-host.ok.js +1 -0
  35. package/public/components/env-picker.ok.js +1 -0
  36. package/public/components/field-path-input.ok.js +1 -0
  37. package/public/components/field.html +6 -0
  38. package/public/components/geo-map.ok.js +1 -0
  39. package/public/components/ok-cron-input.ok.js +1 -0
  40. package/public/components/ok-dropzone.ok.js +1 -0
  41. package/public/components/ok-js-input.ok.js +1 -0
  42. package/public/components/ok-json-input.ok.js +1 -0
  43. package/public/components/ok-text-monaco-input.ok.js +1 -0
  44. package/public/components/theme-toggle.ok.js +1 -0
  45. package/public/favicon-16x16.png +0 -0
  46. package/public/favicon-32x32.png +0 -0
  47. package/public/favicon.ico +0 -0
  48. package/public/images/logo.png +0 -0
  49. package/public/images/logo.svg +333 -0
  50. package/public/index.html +6 -0
  51. package/public/layouts/_default.ok.html +1 -0
  52. package/public/layouts/okdb-cube.ok.html +1 -0
  53. package/public/login-app.js +1 -0
  54. package/public/login.html +1 -0
  55. package/public/modules/ok.js +1 -0
  56. package/public/sections/api/index.ok.html +1 -0
  57. package/public/sections/api/parts/api-endpoint.ok.js +1 -0
  58. package/public/sections/auth/index.ok.html +1 -0
  59. package/public/sections/auth/modals/create-token-modal.ok.js +1 -0
  60. package/public/sections/auth/modals/edit-token-modal.ok.js +1 -0
  61. package/public/sections/auth/modals/perm-info-popover.ok.js +1 -0
  62. package/public/sections/auth/parts/token-detail.ok.js +1 -0
  63. package/public/sections/auth/parts/token-list.ok.js +1 -0
  64. package/public/sections/db/index.ok.html +1 -0
  65. package/public/sections/db/modals/add-item-modal.ok.js +1 -0
  66. package/public/sections/db/modals/create-env-modal.ok.js +1 -0
  67. package/public/sections/db/modals/create-fts-modal.ok.js +1 -0
  68. package/public/sections/db/modals/create-index-modal.ok.js +1 -0
  69. package/public/sections/db/modals/create-pipeline-modal.ok.js +1 -0
  70. package/public/sections/db/modals/demo-env-modal.ok.js +1 -0
  71. package/public/sections/db/modals/remove-env-modal.ok.js +1 -0
  72. package/public/sections/db/modals/schema-edit-modal.ok.js +1 -0
  73. package/public/sections/db/parts/db-overview.ok.js +1 -0
  74. package/public/sections/db/parts/db-pipelines-panel.ok.js +1 -0
  75. package/public/sections/db/parts/edit-row.ok.js +1 -0
  76. package/public/sections/db/parts/tm-timeline.ok.js +1 -0
  77. package/public/sections/db/parts/type-changelog.ok.js +1 -0
  78. package/public/sections/db/parts/type-list.ok.js +1 -0
  79. package/public/sections/db/parts/type-pipelines-tab.ok.js +1 -0
  80. package/public/sections/db/parts/type-schema-tab.ok.js +1 -0
  81. package/public/sections/db/parts/type-viewer.ok.js +1 -0
  82. package/public/sections/db/parts/type-violations-tab.ok.js +1 -0
  83. package/public/sections/docs/index.ok.html +1 -0
  84. package/public/sections/embeddings/index.ok.html +1 -0
  85. package/public/sections/embeddings/modals/register-model-modal.ok.js +1 -0
  86. package/public/sections/embeddings/parts/embed-create-panel.ok.js +1 -0
  87. package/public/sections/embeddings/parts/embed-embedder-panel.ok.js +1 -0
  88. package/public/sections/embeddings/parts/embed-engine-declaration-editor.ok.js +1 -0
  89. package/public/sections/embeddings/parts/embed-engine-list.ok.js +1 -0
  90. package/public/sections/embeddings/parts/embed-indexer-panel.ok.js +1 -0
  91. package/public/sections/embeddings/parts/embed-lifecycle-bar.ok.js +1 -0
  92. package/public/sections/embeddings/parts/embed-model-catalog.ok.js +1 -0
  93. package/public/sections/embeddings/parts/embed-overview.ok.js +1 -0
  94. package/public/sections/embeddings/parts/embed-search-panel.ok.js +1 -0
  95. package/public/sections/embeddings/parts/embed-worker-panel.ok.js +1 -0
  96. package/public/sections/embeddings/parts/embeddings-engine-panel.ok.js +1 -0
  97. package/public/sections/embeddings/parts/engines-overview.ok.js +1 -0
  98. package/public/sections/embeddings/parts/pipeline-create-panel.ok.js +1 -0
  99. package/public/sections/engines/engine-panel-shared-style.js +1 -0
  100. package/public/sections/engines/engine-ui-utils.js +1 -0
  101. package/public/sections/engines/index.ok.html +1 -0
  102. package/public/sections/engines/modals/engine-modal.ok.js +1 -0
  103. package/public/sections/engines/parts/engine-declaration-editor.ok.js +1 -0
  104. package/public/sections/engines/parts/engine-lifecycle-actions.ok.js +1 -0
  105. package/public/sections/engines/parts/engine-panel-shell.ok.js +1 -0
  106. package/public/sections/engines/parts/engine-resource-card.ok.js +1 -0
  107. package/public/sections/engines/parts/engine-row-item.ok.js +1 -0
  108. package/public/sections/engines/parts/generic-engine-panel.ok.js +1 -0
  109. package/public/sections/files/index.ok.html +1 -0
  110. package/public/sections/files/parts/files-blob-status.ok.js +1 -0
  111. package/public/sections/files/parts/files-collection-list.ok.js +1 -0
  112. package/public/sections/files/parts/files-collection-panel.ok.js +1 -0
  113. package/public/sections/files/parts/files-file-list.ok.js +1 -0
  114. package/public/sections/files/parts/files-overview.ok.js +1 -0
  115. package/public/sections/files/parts/files-path-browser.ok.js +1 -0
  116. package/public/sections/files/parts/files-upload-panel.ok.js +1 -0
  117. package/public/sections/functions/index.ok.html +1 -0
  118. package/public/sections/functions/modals/function-modal.ok.js +1 -0
  119. package/public/sections/functions/parts/function-detail.ok.js +1 -0
  120. package/public/sections/functions/parts/function-logs.ok.js +1 -0
  121. package/public/sections/functions/parts/function-runner.ok.js +1 -0
  122. package/public/sections/functions/parts/functions-list.ok.js +1 -0
  123. package/public/sections/license/index.ok.html +1 -0
  124. package/public/sections/license/parts/license-panel.ok.js +1 -0
  125. package/public/sections/processors/index.ok.html +1 -0
  126. package/public/sections/queue/index.ok.html +1 -0
  127. package/public/sections/queue/modals/create-bucket-modal.ok.js +1 -0
  128. package/public/sections/queue/modals/edit-bucket-modal.ok.js +1 -0
  129. package/public/sections/queue/modals/edit-job-modal.ok.js +1 -0
  130. package/public/sections/queue/modals/enqueue-job-modal.ok.js +1 -0
  131. package/public/sections/queue/modals/job-type-modal.ok.js +1 -0
  132. package/public/sections/queue/parts/ok-job-form.ok.js +1 -0
  133. package/public/sections/queue/parts/queue-buckets.ok.js +1 -0
  134. package/public/sections/queue/parts/queue-job-types.ok.js +1 -0
  135. package/public/sections/queue/parts/queue-jobs.ok.js +1 -0
  136. package/public/sections/queue/parts/queue-types.ok.js +1 -0
  137. package/public/sections/queue/parts/queue-workers.ok.js +1 -0
  138. package/public/sections/sync/index.ok.html +5 -0
  139. package/public/sections/sync/parts/sync-node-detail.ok.js +1 -0
  140. package/public/sections/sync/parts/sync-retention.ok.js +1 -0
  141. package/public/sections/sync/parts/sync-topology.ok.js +1 -0
  142. package/public/sections/system/index.ok.html +1 -0
  143. package/public/sections/system/modals/data-ops-modal.ok.js +1 -0
  144. package/public/sections/system/parts/system-api-panel.ok.js +1 -0
  145. package/public/sections/system/parts/system-auth-panel.ok.js +1 -0
  146. package/public/sections/system/parts/system-log-history.ok.js +1 -0
  147. package/public/sections/system/parts/system-log.ok.js +1 -0
  148. package/public/sections/system/parts/system-status.ok.js +1 -0
  149. package/public/sections/system/parts/system-sync-panel.ok.js +1 -0
  150. package/public/sections/views/index.ok.html +1 -0
  151. package/public/sections/views/modals/create-view-modal.ok.js +1 -0
  152. package/public/sections/views/parts/view-detail.ok.js +1 -0
  153. package/public/sections/views/parts/views-list.ok.js +1 -0
  154. package/public/sections/views/parts/views-overview.ok.js +1 -0
  155. package/public/setup-app.js +1 -0
  156. package/public/setup.html +1 -0
  157. package/public/site.webmanifest +1 -0
  158. package/public/stores/auth-store.js +1 -0
  159. package/public/stores/events-store.js +1 -0
  160. package/public/stores/functions-store.js +1 -0
  161. package/public/stores/okdb-store.js +1 -0
  162. package/public/stores/theme-store.js +1 -0
  163. package/public/styles.css +1 -0
  164. package/public/test-cron-input.html +10 -0
  165. package/public/test-json-input.html +101 -0
  166. package/public/util/permissions.js +1 -0
  167. package/public/util/sift-schema.js +1 -0
  168. package/public/vendor/okjs/ok.esm.min.js +2 -0
  169. package/public/vendor/okjs/toolkit/behavior/async.ok.js +1 -0
  170. package/public/vendor/okjs/toolkit/components/ok-chart.ok.js +1 -0
  171. package/public/vendor/okjs/toolkit/components/ok-doc-viewer.ok.js +1 -0
  172. package/public/vendor/okjs/toolkit/components/ok-marked.ok.js +1 -0
  173. package/public/vendor/okjs/toolkit/components/ok-monaco.ok.js +1 -0
  174. package/public/vendor/okjs/toolkit/core/ok-layer-service.ok.js +1 -0
  175. package/public/vendor/okjs/toolkit/core/ok-layer.ok.js +1 -0
  176. package/public/vendor/okjs/toolkit/core/ok-overlay.ok.js +1 -0
  177. package/public/vendor/okjs/toolkit/core/ok-sandbox.ok.js +1 -0
  178. package/public/vendor/okjs/toolkit/core/transition.ok.js +1 -0
  179. package/public/vendor/okjs/toolkit/core/virtualized.ok.js +1 -0
  180. package/public/vendor/okjs/toolkit/devtools/ok-console-service.ok.js +1 -0
  181. package/public/vendor/okjs/toolkit/devtools/ok-console.ok.js +1 -0
  182. package/public/vendor/okjs/toolkit/devtools/ok-fps-monitor-service.ok.js +1 -0
  183. package/public/vendor/okjs/toolkit/devtools/ok-fps-monitor.ok.js +1 -0
  184. package/public/vendor/okjs/toolkit/devtools/ok-inspector-service.ok.js +1 -0
  185. package/public/vendor/okjs/toolkit/devtools/ok-inspector.ok.js +1 -0
  186. package/public/vendor/okjs/toolkit/devtools/ok-js-tree.ok.js +1 -0
  187. package/public/vendor/okjs/toolkit/devtools/ok-timeline-service.ok.js +1 -0
  188. package/public/vendor/okjs/toolkit/devtools/ok-timeline.ok.js +1 -0
  189. package/public/vendor/okjs/toolkit/docs/doc-viewer.ok.js +1 -0
  190. package/public/vendor/okjs/toolkit/editor/ok-live-component.ok.js +1 -0
  191. package/public/vendor/okjs/toolkit/editor/ok-live-example.ok.js +1 -0
  192. package/public/vendor/okjs/toolkit/editor/ok-live-shell.ok.js +1 -0
  193. package/public/vendor/okjs/toolkit/elements/ok-dropdown.ok.js +1 -0
  194. package/public/vendor/okjs/toolkit/elements/ok-icon.ok.js +1 -0
  195. package/public/vendor/okjs/toolkit/elements/ok-select.ok.js +1 -0
  196. package/public/vendor/okjs/toolkit/elements/ok-table.ok.js +1 -0
  197. package/public/vendor/okjs/toolkit/errors/ok-crash-boundary.ok.js +1 -0
  198. package/public/vendor/okjs/toolkit/errors/ok-crash-info.ok.js +1 -0
  199. package/public/vendor/okjs/toolkit/i18n/i18n-editor-examples.ok.js +1 -0
  200. package/public/vendor/okjs/toolkit/i18n/i18n-editor.ok.js +1 -0
  201. package/public/vendor/okjs/toolkit/i18n/i18n-key-editor-tips.ok.js +1 -0
  202. package/public/vendor/okjs/toolkit/i18n/i18n-key-editor.ok.js +1 -0
  203. package/public/vendor/okjs/toolkit/i18n/i18n-service.ok.js +1 -0
  204. package/public/vendor/okjs/toolkit/i18n/ok-i18n.js +1 -0
  205. package/public/vendor/okjs/toolkit/interaction/ok-contextmenu.ok.js +1 -0
  206. package/public/vendor/okjs/toolkit/interaction/ok-dismiss-service.ok.js +1 -0
  207. package/public/vendor/okjs/toolkit/interaction/ok-draggable.ok.js +1 -0
  208. package/public/vendor/okjs/toolkit/interaction/ok-flyover-panel.ok.js +1 -0
  209. package/public/vendor/okjs/toolkit/interaction/ok-flyover.ok.js +1 -0
  210. package/public/vendor/okjs/toolkit/interaction/ok-highlight-service.ok.js +1 -0
  211. package/public/vendor/okjs/toolkit/interaction/ok-highlight.ok.js +1 -0
  212. package/public/vendor/okjs/toolkit/interaction/ok-hotkeys-service.ok.js +1 -0
  213. package/public/vendor/okjs/toolkit/interaction/ok-picker-service.ok.js +1 -0
  214. package/public/vendor/okjs/toolkit/interaction/ok-popout-service.ok.js +1 -0
  215. package/public/vendor/okjs/toolkit/interaction/ok-popout.ok.js +1 -0
  216. package/public/vendor/okjs/toolkit/interaction/ok-portal-service.ok.js +1 -0
  217. package/public/vendor/okjs/toolkit/interaction/ok-submenu.ok.js +1 -0
  218. package/public/vendor/okjs/toolkit/layout/ok-resizer.ok.js +1 -0
  219. package/public/vendor/okjs/toolkit/manifest.js +1 -0
  220. package/public/vendor/okjs/toolkit/modals/ok-modal-service.ok.js +1 -0
  221. package/public/vendor/okjs/toolkit/modals/ok-modal.ok.js +1 -0
  222. package/public/vendor/okjs/toolkit/modals/ok-toast-service.ok.js +1 -0
  223. package/public/vendor/okjs/toolkit/modals/ok-window.ok.js +1 -0
  224. package/public/vendor/okjs/toolkit/navigation/hash-router.ok.js +1 -0
  225. package/public/vendor/okjs/toolkit/navigation/history-router.ok.js +1 -0
  226. package/public/vendor/okjs/toolkit/navigation/router.ok.js +1 -0
  227. package/public/vendor/okjs/toolkit/sync/reactive-sync-service.ok.js +1 -0
  228. package/public/vendor/okjs/toolkit/sync/reactive-sync.js +1 -0
  229. package/public/vendor/okjs/toolkit/theming/blocks/ok-design-button.css.js +1 -0
  230. package/public/vendor/okjs/toolkit/theming/blocks/ok-design-input.css.js +1 -0
  231. package/public/vendor/okjs/toolkit/theming/ok-design-style.js +1 -0
  232. package/public/vendor/okjs/toolkit/theming/ok-design-vars.js +1 -0
  233. package/public/vendor/okjs/toolkit/theming/ok-design.ok.js +1 -0
  234. package/public/vendor/okjs/toolkit/theming/ok-theme-editor/ok-theme-editor-input.ok.js +1 -0
  235. package/public/vendor/okjs/toolkit/theming/ok-theme-editor/ok-theme-editor-service.ok.js +1 -0
  236. package/public/vendor/okjs/toolkit/theming/ok-theme-editor/ok-theme-editor-style.js +1 -0
  237. package/public/vendor/okjs/toolkit/theming/ok-theme-editor/ok-theme-editor-utils.js +1 -0
  238. package/public/vendor/okjs/toolkit/theming/ok-theme-editor/ok-theme-editor-variable.ok.js +1 -0
  239. package/public/vendor/okjs/toolkit/theming/ok-theme-editor/ok-theme-editor-vm.js +1 -0
  240. package/public/vendor/okjs/toolkit/theming/ok-theme-editor/ok-theme-editor.ok.js +1 -0
  241. package/public/vendor/okjs/toolkit/theming/ok-theme.ok.js +1 -0
  242. package/public/view-models/type-query-vm.js +1 -0
  243. package/types/environment.d.ts +130 -0
  244. package/types/errors.d.ts +98 -0
  245. package/types/features/admin.d.ts +4 -0
  246. package/types/features/api.d.ts +18 -0
  247. package/types/features/auth.d.ts +31 -0
  248. package/types/features/embeddings.d.ts +39 -0
  249. package/types/features/engines.d.ts +23 -0
  250. package/types/features/files.d.ts +29 -0
  251. package/types/features/fts.d.ts +25 -0
  252. package/types/features/functions.d.ts +23 -0
  253. package/types/features/mcp.d.ts +17 -0
  254. package/types/features/pipelines.d.ts +19 -0
  255. package/types/features/queue.d.ts +189 -0
  256. package/types/features/sync.d.ts +34 -0
  257. package/types/features/time-machine.d.ts +32 -0
  258. package/types/features/views.d.ts +16 -0
  259. package/types/index.d.ts +153 -0
  260. package/types/options.d.ts +202 -0
@@ -0,0 +1 @@
1
+ var e={tag:"ok-js-tree",attr:{key:{},parent:{},editable:{type:"boolean",default:!1,empty:!0}},context(e){const t={expanded:!1,currentType:null,get localKey(){return e.$attr.key},newKeyName:e.$attr.key,get readonly(){const t=Object.getOwnPropertyDescriptor(e.$attr.parent,e.$attr.key);return!(t.writable||t.set)},get editable(){return!1!==e.$attr.editable},get parent(){return e.$attr.parent},get value(){return this.parent?.[this.localKey]},get isFunction(){return"function"==typeof this.value},get isObject(){return"object"==typeof this.value&&null!==this.value&&!Array.isArray(this.value)},get isArray(){return Array.isArray(this.value)},get isExpandable(){return this.isFunction||this.isObject||this.isArray},get isRoot(){return null==this.localKey&&"object"==typeof this.parent},get canEditKey(){return!this.readonly&&this.editable&&!Array.isArray(this.parent)},get canEditValue(){return!this.readonly&&this.editable},get canDeleteSelf(){return this.editable&&!Array.isArray(this.parent)},get typeLabel(){return this.isArray?"[Array]":this.isObject?"[Object]":this.isFunction?"[Function]":null===this.value?"[Null]":void 0===this.value?"[Undefined]":"symbol"==typeof this.value?"[Symbol] "+this.value.toString():"bigint"==typeof this.value?"[BigInt] "+this.value+"n":"string"==typeof this.value?"[String]":"number"==typeof this.value?"[Number]":"boolean"==typeof this.value?"[Boolean]":""},get preview(){const e=this.value;if("string"==typeof e)return'"'+e+'"';if("function"==typeof e)return"[code]";try{return JSON.stringify(e)}catch{return"[Circular]"}},get style(){const e=this.value;if(null==e)return"color:#888;font-style:italic;";switch(typeof e){case"string":return"color:#f6f;";case"number":return"color:#6cf;";case"boolean":return"color:#fc6;";case"symbol":return"color:#aaa;";case"bigint":return"color:#ccc;";default:return""}},get isReactive(){return e.$ok?.proxyInstance?.isProxy?.(this.parent)},toggle(){(this.isExpandable||this.editable)&&(this.expanded=!this.expanded)},init(){const e=this.value;null===e?this.currentType="null":void 0===e?this.currentType="undefined":Array.isArray(e)?this.currentType="array":this.currentType="object"==typeof e?"object":typeof e},update(e){if(this.canEditValue)switch(this.currentType){case"string":this.parent[this.localKey]=e;break;case"number":const t=parseFloat(e);isNaN(t)||(this.parent[this.localKey]=t);break;case"boolean":this.parent[this.localKey]="true"===e}},changeType(e){switch(this.currentType=e,e){case"string":this.parent[this.localKey]="";break;case"number":this.parent[this.localKey]=0;break;case"boolean":this.parent[this.localKey]=!1;break;case"null":this.parent[this.localKey]=null;break;case"undefined":this.parent[this.localKey]=void 0;break;case"object":this.parent[this.localKey]={},this.expanded=!0;break;case"array":this.parent[this.localKey]=[],this.expanded=!0}},deleteSelf(){delete this.parent?.[this.localKey]},commitEdit(){const e=this.localKey,t=this.newKeyName;if(!this.parent||t===e||!t||t in this.parent)return;const a=this.parent[e];delete this.parent[e],this.parent[t]=a,this.localKey=t},onKeyDown(e){"Enter"===e.key&&this.commitEdit()},addObjectKey(){if(!this.editable||!this.isObject&&!this.isRoot)return;let e=1,t="newKey",a=t+e;for(;a in this.value;)a=t+ ++e;this.value[a]=null},addArrayItem(){this.editable&&this.isArray&&this.value.push(null)},deleteObjectKey(e){delete this.value[e]}};return t.init(),t},template:'<div style="padding-left:1em;border-left:2px solid #0f03;font-family:monospace;font-size:13px"><div @click="toggle" style="cursor:pointer;display:flex"><span class="ok-js-tree__toggle" :class="isExpandable\n ? (expanded ? \'ok-js-tree__toggle--expand\' : \'ok-js-tree__toggle--collapse\')\n : \'ok-js-tree__toggle--neutral\'"/> <span style="color:#888">{{ localKey }}:</span><if :="isReactive"><span title="Reactive" style="color:#0a0;margin-left:4px">★</span></if><span style="margin-left:.25em;max-width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis" :style="style" :title="typeLabel + \' \' + preview">{{ typeLabel }} {{ preview }}</span></div><if :="expanded"><div style="margin-left:1em;margin-top:.3em;display:flex;flex-direction:column"><if :="canEditKey"><div style="display:flex;flex-wrap:wrap;gap:.5em;align-items:center"><input !value="newKeyName" @blur="commitEdit" @keydown="onKeyDown" @mounted="$el.focus()"><label><span style="margin-right:4px">Type:</span> <select @click.stop @change="changeType($el.value)" :value="currentType" :disabled="!canEditValue"><option value="string">string</option><option value="number">number</option><option value="boolean">boolean</option><option value="null">null</option><option value="undefined">undefined</option><option value="object">object</option><option value="array">array</option></select></label><if :="canDeleteSelf"><button @click="deleteSelf" style="color:red;background:0 0;border:none;font:inherit;cursor:pointer">✕</button></if></div></if><switch :value="currentType"><case value="string"><textarea @input="update($el.value)" :disabled="!canEditValue" style="min-width:200px">{{ value }}</textarea></case><case value="number"><input type="number" :value="value" @input="update($el.value)" :disabled="!canEditValue"></case><case value="boolean"><select @change="update($el.value)" :value="value + \'\'" :disabled="!canEditValue"><option value="true">true</option><option value="false">false</option></select></case></switch><if :="isObject || isRoot"><each default-height="20" :of="[...Object.keys(value)]" let:item="key" style="max-height:400px"><ok-js-tree :key :parent="value" :editable="editable"/></each><if :="editable"><button @click="addObjectKey" style="background:0 0;border:none;font:inherit;cursor:pointer">➕</button></if></if><if :="isArray"><each default-height="22" :of="value" let:item let:index style="max-height:400px"><ok-js-tree :key="index" :parent="value" :editable="editable"/></each><if :="editable"><button @click="addArrayItem" style="background:0 0;border:none;font:inherit;cursor:pointer">➕</button></if></if><if :="isFunction"><pre style="margin-left:1em">{{ value.toString() }}</pre></if></div></if></div>',style:"@keyframes[tag]__pulse{0%,to{opacity:.5;transform:translateY(0)}50%{opacity:1;transform:translateY(2px)}}[tag]{display:block}[tag] .ok-js-tree__toggle{display:inline-block;min-width:1rem;vertical-align:middle;color:#888;transform-origin:50% 50%;transition:transform .15s ease;clip-path:polygon(30% 20%,70% 50%,30% 80%);background:#888}[tag] .ok-js-tree__toggle--expand{transform:rotate(90deg)}[tag] .ok-js-tree__toggle--collapse{transform:rotate(0deg)}[tag] .ok-js-tree__toggle--neutral{background:#888;clip-path:circle(20%at 50% 50%);transform:none}"};export{e as default};
@@ -0,0 +1 @@
1
+ var e={tag:"ok-timeline-service",dependencies:["./ok-timeline.ok.js","../core/ok-sandbox.ok.js","../modals/ok-window.ok.js"],register(e,o){if(e.shared.timeline={window:null,async toggle(t=null,i=null){this.root=i;const s=await e.shared.layer.toggle("ok-timeline-service",t,{registration:o,tier:"window"});s?(await s.$scope.$lifecycle.mounted,this.window=s.$scope):(this.window=null,this.root=null)}},"dev"===e.config.env||!0===e.config.shared.timeline?.register){let o=e.shared.hotkeys;const t=()=>{o.register(["ctrl","alt","q"],{description:"Toggle Timeline Monitor",keydown(o){o.repeat||e.shared.picker.start({onPick:async o=>{await e.shared.timeline.toggle(!1),await e.shared.timeline.toggle(!0,o.$scope)}})},keyup(){e.shared.picker.stop()}})};if(o)t();else{const i=e.on("registered",()=>{o=e.shared.hotkeys,o&&(t(),i.stop())})}}},context:e=>({get root(){return e.$ok.shared.timeline.root||e.$root}}),template:'<ok-window no-portal title="Timeline" autohidehud @close="$ok.shared.timeline.toggle(false)"><ok-sandbox><ok-timeline :root/></ok-sandbox></ok-window>'};export{e as default};
@@ -0,0 +1 @@
1
+ const e=(e,t)=>{const n=t.$__init__$||performance.now(),a=e.$ok.proxy({first:n,last:n,updateLast(e){e>this.last&&(this.last=e)}}),o=new Map;function i(n){let r=o.get(n);const p=t.$ok.idToScope.get(n);if(!p)return null;if(!r){if(r=e.$ok.proxy({id:n,scope:p,_expanded:null,get expanded(){return null===this._expanded?!this.scope.$cache.cmp:this._expanded},set expanded(e){this._expanded=e},activate:p.$__init__$,mount:p.$__init__$,mounted:p.$lifecycle?.mounted.timestamp,ready:p.$lifecycle?.ready.timestamp,initialized:p.$lifecycle?.initialized.timestamp,unmount:null,unmounted:null,destroyed:null,state:p.$state,type:"unknown",label:"unknown",children:[],updateChildren(){const e=[...t.$ok.dom.range(this.scope.$el)].map(e=>e.$scope);for(const t of e)t&&i(t.$id)},updateLabel(){return p.$el.nodeType===Node.TEXT_NODE?this.label="#text":this.label=p.$cache.cmp?.def.tag||p.$el.tagName?.toLowerCase()},updateType:()=>p.$el.nodeType===Node.TEXT_NODE?"text":p.$cache.cmp?"component":"element"}),r.updateLabel(),r.type=r.updateType(),a.updateLast(performance.now()),o.set(n,r),p.$parent){const e=i(p.$parent.$id);e.children.includes(r)||e.children.push(r)}r.updateChildren()}return r}return t.$ok.on("scope@activate",e=>{const t=i(e.$id);a.updateLast(performance.now()),t.state=e.$state,t.activate=e.$__init__$}),t.$ok.on("scope@mount",e=>{const t=i(e.$id);a.updateLast(performance.now()),t.state=e.$state,t.mount=performance.now()}),t.$ok.on("scope@mounted",e=>{const t=i(e.$id);a.updateLast(performance.now()),t.state=e.$state,t.mounted=e.$lifecycle.mounted.timestamp}),t.$ok.on("scope@ready",e=>{const t=i(e.$id);t.state=e.$state,a.updateLast(performance.now()),t.ready=e.$lifecycle.ready.timestamp}),t.$ok.on("scope@initialized",e=>{const t=i(e.$id);t.state=e.$state,a.updateLast(performance.now()),t.initialized=e.$lifecycle.initialized.timestamp}),t.$ok.on("scope@unmount",e=>{const t=i(e.$id);a.updateLast(performance.now()),t.state=e.$state,t.unmount=e.$__unmount__$}),t.$ok.on("scope@unmounted",e=>{const t=i(e.$id);a.updateLast(performance.now()),t.state=e.$state,t.unmounted=e.$lifecycle.unmounted.timestamp}),{t0:n,root:i(t.$id)}};var t={tag:"ok-timeline",dependencies:[{tag:"ok-timeline-bar",attr:{row:{},t0:{}},context(e){function t(t,n,a){return null==t||null==n||n<=t?null:{left:.2*(t-e.$attr.t0),width:.2*(n-t),cls:a}}return{get bars(){const n=e.$attr.row;return[t(n.activate,n.mount,"phase-activate"),t(n.mount,n.mounted,"phase-mount"),t(n.mounted,n.ready,"phase-ready"),t(n.ready,n.initialized,"phase-init"),t(n.unmount,n.unmounted||n.unmount+1,"phase-unmount")].filter(Boolean)}}},template:'\n <div class="bar-container">\n <each :="bars" let:item="b">\n <div class="bar" :class="b.cls"\n :style="{ left: b.left + \'px\', width: b.width + \'px\' }">\n </div>\n </each>\n </div>\n ',style:"\n [tag]{\n position: relative;\n display: block;\n height: var(--row-h);\n }\n\n .bar-container {\n position: relative;\n height: 100%;\n }\n\n .bar{\n position: absolute;\n top: var(--bar-offset);\n height: var(--bar-h);\n box-shadow: inset 0 0 1px rgba(0,0,0,0.6);\n }\n\n tag.phase-activate { background: #8886; }\n .phase-mount { background: #4cf9; }\n .phase-ready { background: #8f89; }\n .phase-init { background: #f88a; }\n .phase-unmount { background: #fa84; }\n "},{tag:"ok-timeline-name",attr:{depth:{default:0}},template:'<span :class="row.state">{{ $props.row.label }}</span>',style:"[tag]{--indent:4px;position:relative;display:block;height:var(--row-h);line-height:var(--row-h);padding-left:calc(var(--depth)*var(--indent) + 4px);overflow:hidden;text-overflow:ellipsis}[tag] .initialized{color:#8f8}[tag] .ready{color:#8ff}[tag] .mounted{color:#4ff}[tag] .mounted .initialized{color:#6f8}[tag] .mounting{color:#4f4}[tag] .unmounted{color:#f88}"},{tag:"ok-timeline-item",attr:{depth:{default:0},row:{default:null}},template:'\n <slot :var:row="$props.row" :var:depth="$props.depth" />\n <if :="$props.row.expanded && $props.row.children.length > 0">\n <each :="$props.row.children" let:item="row">\n <ok-timeline-item :row :depth="$props.depth + 1" :style="{ \'--depth\': $props.depth }" let:row>\n <slot :var:row="row" :var:depth="$props.depth + 1" />\n </ok-timeline-item>\n </each>\n </if>',style:"\n [tag]{\n display: block;\n white-space: nowrap;\n }"}],context:t=>e(t,t.$attr.root),template:'\n <div class="names">\n <ok-timeline-item :row="root" let:row let:depth>\n <ok-timeline-name :row :depth @click="row.expanded = !row.expanded" />\n </ok-timeline-item>\n </div>\n\n <div class="bars">\n <ok-timeline-item :row="root" let:row let:depth>\n <ok-timeline-bar :row :depth :t0 />\n </ok-timeline-item>\n </div>\n ',style:"\n [tag] {\n --row-h: 16px;\n --bar-h: 10px;\n --bar-offset: calc((var(--row-h) - var(--bar-h)) / 2);\n --indent: 16px;\n\n display: flex;\n flex-direction: row;\n gap: 16px;\n font-family: monospace;\n font-size: 12px;\n border: 1px solid rgba(255,255,255,0.12);\n padding: 10px;\n }\n\n .names {\n flex: 1;\n overflow-x: auto;\n\n }\n\n .bars {\n flex: 3;\n overflow-x: auto;\n position: relative;\n\n background-image:\n repeating-linear-gradient(\n to right,\n rgba(255,255,255,0.04) 0,\n rgba(255,255,255,0.04) 1px,\n transparent 1px,\n transparent 20px\n ),\n repeating-linear-gradient(\n to right,\n rgba(255,255,255,0.08) 0,\n rgba(255,255,255,0.08) 2px,\n transparent 2px,\n transparent 100px\n );\n }\n "};export{t as default};
@@ -0,0 +1 @@
1
+ import e from"../components/ok-doc-viewer.ok.js";var t={tag:"doc-viewer",dependencies:[e],attr:{anchor:{},file:{},root:{default:"/docs/"},prefix:{default:"#/docs/"}},context:()=>({blocks:[{name:"live-example",params:{html:"html",js:["js","javascript"],css:"css"},render({params:e}){const t=document.createElement("ok-live-example");return t.setAttribute("html",e.html||""),e.js&&t.setAttribute("context",e.js),e.css&&t.setAttribute("css",e.css),t}},{name:"live-component",params:{def:["js","javascript"],dom:"html"},render({params:e}){const t=document.createElement("ok-live-component");return t.setAttribute("def",e.def||"({ tag:'my-component', template:`<h1>Hello</h1>` })"),t.setAttribute("usage",e.dom||"<my-component></my-component>"),t}}]}),template:'<ok-doc-viewer :file="$props.file" :root="$props.root" :prefix="$props.prefix" :anchor="$props.anchor" :blocks @anchor-change="$cmp.$dispatch(\'anchor-change\', $event.detail)"/>'};export{t as default};
@@ -0,0 +1 @@
1
+ import t from"./ok-live-shell.ok.js";var e={tag:"ok-live-component",dependencies:[t],unwrap:!0,attr:{tag:{default:"my-component"},def:{},usage:{}},context:t=>({args:{filename:t.$attr.filename||`live-${t.$attr.tag}.json`,tabs:[{id:"definition",label:"Definition",language:"javascript",default:t.$attr.def||`({\n\ttag: '${t.$attr.tag}',\n\ttemplate: \`${t.$attr.tag}\`\n})`},{id:"usage",label:"Usage",language:"html",default:t.$attr.usage||`<${t.$attr.tag}></${t.$attr.tag}>`}],render:async(t,e,a)=>{a.find(t=>"definition"===t.id).error=null;let n=e.get("definition")||"{}";n=t.func(n)(),t.register(n,{parentId:null,override:!0});const i=document.createElement("div");return i.innerHTML=e.get("usage"),await t.init(i),i}}}),template:"<ok-live-shell ...args/>"};export{e as default};
@@ -0,0 +1 @@
1
+ import t from"./ok-live-shell.ok.js";var e={tag:"ok-live-example",dependencies:[t],unwrap:!0,attr:{tag:{default:"my-component"},html:{default:""},context:{default:null},css:{default:null}},context(t){const e=[{id:"html",label:"HTML",language:"html",default:t.$attr.html}];return null!==t.$attr.context&&e.push({id:"context",label:"Context",language:"javascript",default:t.$attr.context}),null!==t.$attr.css&&e.push({id:"css",label:"CSS",language:"css",default:t.$attr.css}),{args:{filename:t.$attr.filename||`live-${t.$attr.tag}.json`,tabs:e,render:async(t,e,n)=>{const l=document.createElement("div"),a=t.scope(l,{$parent:null});l.innerHTML=e.get("html");const r=n.find(t=>"context"===t.id);if(r){const n=e.get("context")||"{}";r.error=null;try{let t=a.$fn(n)(a);"function"==typeof t&&(t=t(a)),a.$innerContext=t}catch(e){throw r.error=e,t.error("BAD_CONTEXT",e)}}if(n.find(t=>"css"===t.id)){const t=document.createElement("style");t.textContent=e.get("css")||"",l.prepend(t)}return t.dom.unwrap(l),await a.$init(),l}}}},template:"<ok-live-shell ...args/>"};export{e as default};
@@ -0,0 +1 @@
1
+ const e="server-render"===globalThis.__OK_SSG__?.phase,t=e?'\n<div class="main main--ssg">\n <div class="preview preview--ssg">\n <div class="ssg-placeholder">\n <div class="ssg-placeholder__title">Interactive example</div>\n <div class="ssg-placeholder__text">This live editor becomes interactive after hydration.</div>\n </div>\n </div>\n</div>':'\n<if :="window">\n <ok-overlay style="--ok-overlay_bg: rgba(0, 0, 0, 0.5)">\n <ok-window @close="window = false" style="--ok-window_padding: 0; --ok-window_overflow: none;">\n <ok-live-shell no-resize-height @update-content="updateContent($event.detail.tab, $event.detail.content, false)" :tabs="$props.tabs" :filename="$props.filename" :render="$props.render" />\n </ok-window>\n </ok-overlay>\n</if>\n<div class="main">\n <div class="editors" style="width: 70%">\n <div class="header">\n <div class="tabs">\n <each :="tabs" let:item="tab">\n <button class="tab-button" :class="{ active : tab === selectedTab }" @click="selectedTab = tab">\n {{ tab.label }}<if :="tab.error"><span> ⚠</span></if>\n </button>\n </each>\n </div>\n <div class="editor-controls">\n <label title="Auto Update">\n <input type="checkbox" !auto @change="auto && update()" />\n <span style="vertical-align: middle; font-size: 12px;">Auto</span>\n </label>\n <button @click="update()" title="Update"><ok-icon name="play-circle" /></button>\n <button @click="save" title="Save"><ok-icon name="save" /></button>\n <label title="Import">\n <button @click="$el.nextElementSibling.click()">\n <ok-icon name="folder-open" size="16" color="currentColor" />\n </button>\n <input type="file" accept=".json" @change="load" @click:allow="$el.value = null" style="display:none" />\n </label>\n <button @click="reset" title="Reset"><ok-icon name="rotate-ccw" /></button>\n <button @click="toggleWindow" :title="window ? \'Close Window\' : \'Pop Window\'">\n <ok-icon :name="window ? \'x\' : \'external-link\'" />\n </button>\n </div>\n </div>\n\n <ok-monaco\n :language="selectedTab.language"\n :value="getContent(selectedTab)"\n :options="$props.monaco"\n @editor-change="updateContent(selectedTab, $event.detail)"\n ></ok-monaco>\n\n <if :="compileError">\n <div class="error">⚠ {{ compileErrorText }}</div>\n </if>\n </div>\n \n <ok-resizer direction="horizontal" />\n <div :ref="previewEl = $el" class="preview"></div>\n</div>\n<if :="!$props.noResizeHeight">\n <ok-resizer direction="vertical" />\n</if>';var n={tag:"ok-live-shell",attr:{noResizeHeight:{default:!1,empty:!0},filename:{default:"live-shell.json"},monaco:{default:{minimap:{enabled:!1}}},tabs:{default:[{id:"html",label:"HTML",language:"html",error:null,default:""},{id:"context",label:"Context",language:"javascript",error:null,default:"{}"}]},render:{default:async(e,t,n)=>{const o=document.createElement("div");return o.innerHTML="ok-live-shell component loaded. Please provide a render function to display content.",o},description:"Function that receives the sandbox target, should return html to render"}},context(e){let t=null,n=null,o=null;return{previewEl:null,auto:!0,compileError:null,get compileErrorText(){if(!this.compileError)return"";let e=this.compileError;for(;e.cause?.scope;)e=e.cause;return e.message+(e.cause?` because ${e.cause.message}`:"")},get tabs(){return e.$attr.tabs||[]},selectedTab:e.$attr.tabs[0]||null,content:new Map,getContent(e){const t=this.content.get(e.id);return void 0!==t?t:e.default||""},async updateContent(t,n){const o=n??"";this.content.set(t.id,o),this.auto&&await this.update(),e.$dispatch("update-content",{tab:t,content:n})},save(){const t={};for(let e of this.tabs)t[e.id]=this.getContent(e);const n=new Blob([JSON.stringify(t,null,2)],{type:"application/json"}),o=URL.createObjectURL(n),a=document.createElement("a");a.href=o,a.download=e.$attr.filename,a.click(),URL.revokeObjectURL(o)},async load(e){const t=e.target.files?.[0];if(!t)return;const n=new FileReader;return new Promise((e,o)=>{n.onload=async()=>{try{const t=JSON.parse(n.result);for(let e of this.tabs)void 0===t[e.id]?this.content.delete(e.id):this.content.set(e.id,t[e.id]);await this.update(),e()}catch(t){this.compileError=t,e()}},n.readAsText(t)})},async update(){try{this.compileError=null;const t=await e.$attr.render(o,this.content,this.tabs);for(let e of[...o.dom.range(n)]){const t=e.$scope;t&&t.$destroy&&t.$destroy()}n.innerHTML="",o.dom.append(n,t)}catch(e){this.compileError=e}},async reset(){for(let e of this.tabs)this.content.set(e.id,e.default||"");await this.update()},async init(){t||(t=this.previewEl.attachShadow({mode:"open"}),n=document.createElement("body"),n.style.margin="0",n.style.padding="0",n.style.overflow="auto",n.style.position="relative",n.style.height="100%",t.append(n),o=e.$ok.OK({env:"sandbox",head:t,body:n}),await this.reset())},window:!1,toggleWindow(t=null){const n={tabs:[],render:e.$attr.render.toString()};for(let e of this.tabs)n.tabs.push({id:e.id,label:e.label,language:e.language,default:this.getContent(e)});e.$ok.shared.popout.pop('<ok-live-shell style="padding:0;height: 100vh;" :tabs :render="(new Function(`return (${render})`))()"></ok-live-shell>',{context:n})}}},mounted(){e||this.init()},template:t,style:'[tag]{flex-grow:1;padding:8px 8px 2px;font-family:"Segoe UI","Inter",sans-serif;background:#2a2a2e;color:#ddd;border-radius:8px;box-shadow:0 2px 10px #0005}[tag] .main{display:flex;flex-grow:1;align-items:stretch;min-height:200px}[tag],[tag] .editors{display:flex;flex-direction:column}[tag] .editors{overflow:hidden;gap:8px}[tag] .header{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap}[tag] .tabs{display:flex;gap:0;border-bottom:1px solid #444}[tag] .editor-controls button,[tag] .tab-button{background:0 0;border:0;color:#aaa;cursor:pointer}[tag] .tab-button{border-bottom:2px solid transparent;padding:6px 12px;font-size:13px;transition:all .2s}[tag] .tab-button.active{color:#fff;border-bottom-color:#66f;font-weight:500}[tag] .editor-controls{margin-inline-start:auto;display:flex;align-items:center;gap:8px}[tag] .editor-controls button{font-size:16px;padding:4px}[tag] .editor-controls button:hover{color:#fff}[tag] .editor-controls input[type=checkbox]{margin-right:4px}[tag] .preview,[tag] ok-monaco{border:1px solid #444;border-radius:4px}[tag] ok-monaco{overflow:hidden;height:200px}[tag] .preview{flex:1;background:#111;padding:10px;overflow:auto}[tag] .main--ssg{min-height:240px}[tag] .preview--ssg{display:flex;align-items:center;justify-content:center}[tag] .ssg-placeholder{max-width:28rem;text-align:center;padding:1.5rem;border:1px solid #334;border-radius:12px;background:rgba(255,255,255,.03)}[tag] .ssg-placeholder__title{color:#fff;font-size:1rem;font-weight:600;margin-bottom:.5rem}[tag] .ssg-placeholder__text{color:#aaa;line-height:1.5}[tag] .error{color:#f66;background:#330;border:1px solid #600;padding:6px 8px;margin-top:6px;border-radius:4px;font-size:13px}'};export{n as default};
@@ -0,0 +1 @@
1
+ var o={tag:"ok-dropdown",attr:{open:{default:!1,empty:!0},title:{default:""},noCaret:{default:!1,empty:!0},placement:{default:"auto"},noKeyboard:{default:!1,empty:!0}},context:o=>({isOpen:!!o.$attr.open,opensUp:!1,toggle(r){const e=void 0!==r?!!r:!this.isOpen;e&&(this.opensUp=(()=>{const r=o.$attr.placement;if("top"===r)return!0;if("bottom"===r)return!1;const e=o.$el.getBoundingClientRect();return window.innerHeight-e.bottom<220})()),this.isOpen=e,o.$dispatch("toggle",{open:e})}}),mount(o){o.$el.toggle=o=>this.toggle(o),o.$el.open=()=>this.toggle(!0),o.$el.close=()=>this.toggle(!1),o.$watch(()=>o.$attr.open,o=>{!!o!==this.isOpen&&this.toggle(!!o)})},template:'<div class="ok-dropdown" :class="{ \'ok-dropdown--open\': isOpen, \'ok-dropdown--up\': opensUp }"><div class="ok-dropdown__trigger" @click="toggle()" role="button" :tabindex="$props.noKeyboard ? -1 : 0" @keydown:allow="!$props.noKeyboard && ($event.key === \'Enter\' || $event.key === \' \') && toggle()" :aria-expanded="isOpen" :aria-haspopup="true"><slot name="trigger">{{ $props.title }}</slot><if :="!$props.noCaret"><span class="ok-dropdown__caret" aria-hidden="true"><svg width="10" height="6" viewBox="0 0 10 6" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M1 1L5 5L9 1" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg></span></if></div><if :="isOpen"><div class="ok-dropdown__panel" :class="{\'ok-dropdown__panel--up\': opensUp}" role="menu"><slot/></div><div class="ok-dropdown__mask" @click="toggle(false)"/></if></div>',style:"@keyframes ok-dropdown-grow{0%{opacity:0;transform:scaleY(.92) translateY(-4px)}to{opacity:1;transform:scaleY(1) translateY(0)}}@keyframes ok-dropdown-grow-up{0%{opacity:0;transform:scaleY(.92) translateY(4px)}to{opacity:1;transform:scaleY(1) translateY(0)}}[tag]{display:inline-block}.ok-dropdown{position:relative}.ok-dropdown--open{z-index:var(--ok-dropdown-z, 1001)}.ok-dropdown__trigger{display:var(--ok-dropdown-trigger-display, inline-flex);align-items:center;gap:var(--ok-dropdown-trigger-gap, 0.35em);cursor:pointer;user-select:none;padding:var(--ok-dropdown-trigger-padding, 0.35rem 0.6rem);border-radius:var(--ok-dropdown-trigger-radius, var(--ok_radius, 4px));border:var(--ok-dropdown-trigger-border, 1px solid transparent);background:var(--ok-dropdown-trigger-bg, transparent);color:var(--ok-dropdown-trigger-color, inherit);outline-offset:2px;transition:background .15s,border-color .15s}.ok-dropdown__trigger:hover{background:var(--ok-dropdown-trigger-hover-bg, color-mix(in srgb, currentColor 8%, transparent))}.ok-dropdown--open .ok-dropdown__trigger{background:var(--ok-dropdown-trigger-active-bg, color-mix(in srgb, currentColor 12%, transparent))}.ok-dropdown__caret{display:inline-flex;align-items:center;flex-shrink:0;transition:transform .2s ease;line-height:0}.ok-dropdown--open .ok-dropdown__caret{transform:rotate(180deg)}.ok-dropdown__panel{position:absolute;z-index:2;top:100%;inset-inline-start:0;min-width:100%;margin-top:var(--ok-dropdown-panel-gap, 2px);padding:var(--ok-dropdown-panel-padding, 0.25rem 0);background:var(--ok-dropdown-panel-bg, var(--ok_bg, #fff));color:var(--ok-dropdown-panel-color, var(--ok_fg, inherit));border:var(--ok-dropdown-panel-border, 1px solid color-mix(in srgb, #000 10%, transparent));border-radius:var(--ok-dropdown-panel-radius, var(--ok_radius, 6px));box-shadow:var(--ok-dropdown-panel-shadow, 0 6px 20px rgba(0,0,0,.12));white-space:nowrap;animation:ok-dropdown-grow .15s ease forwards;transform-origin:top center}.ok-dropdown__panel--up{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--ok-dropdown-panel-gap, 2px);transform-origin:bottom center;animation-name:ok-dropdown-grow-up}.ok-dropdown__mask{position:fixed;inset:0;z-index:1;background:0 0;cursor:default}[tag].pill .ok-dropdown__trigger{border:var(--ok-dropdown-pill-border, 1px solid color-mix(in srgb, currentColor 20%, transparent));border-radius:var(--ok-dropdown-pill-radius, 999px);padding:var(--ok-dropdown-pill-padding, 0.35rem 0.75rem);background:var(--ok-dropdown-pill-bg, var(--ok_bg, #fff))}[tag].pill .ok-dropdown__trigger:hover{filter:brightness(95%)}[tag].block{display:block}[tag].block .ok-dropdown__trigger{justify-content:space-between;border:var(--ok-dropdown-block-border, 1px solid color-mix(in srgb, currentColor 20%, transparent));border-radius:var(--ok-dropdown-block-radius, var(--ok_radius, 4px))}[tag].block .ok-dropdown__panel{width:100%}",plugins:{theme:{expose:{"--ok-dropdown-trigger-bg":{default:"transparent",type:"color",description:"Trigger background",category:"ok-dropdown"},"--ok-dropdown-panel-bg":{default:"var(--ok_bg, #fff)",type:"color",description:"Panel background",category:"ok-dropdown"},"--ok-dropdown-panel-radius":{default:"var(--ok_radius, 6px)",type:"length",description:"Panel border-radius",category:"ok-dropdown"},"--ok-dropdown-panel-shadow":{default:"0 6px 20px rgba(0,0,0,.12)",type:"box-shadow",description:"Panel drop shadow",category:"ok-dropdown"}}}}};export{o as default};
@@ -0,0 +1 @@
1
+ const t=new Map;var e={tag:"ok-icon",attr:{name:{},set:{default:"lucide"}},context:e=>({async updateIcon(){const n=e.$attr.name;if(n)try{const n=`https://api.iconify.design/${e.$attr.set}/${e.$attr.name}.svg`;if(t.has(n))e.$el.innerHTML=t.get(n);else{e.$el.innerHTML='<span style="opacity:0.5">&nbsp;</span>';const a=await fetch(n);if(!a.ok)throw new Error("Icon not found");const s=await a.text();t.set(n,s),e.$el.innerHTML=s}}catch(t){if(e.$__unmount__$)return;e.$el.innerHTML=`\x3c!-- icon "${n}" not found --\x3e<span style="display:block;text-align:center">?</span>`}}}),mount(t){this.updateIcon(),t.$watch(()=>[t.$attr.name,t.$attr.set],()=>{this.updateIcon()})},style:"[tag]{display:inline-flex;width:1em;height:1em;line-height:1}[tag] svg{flex-grow:1;stroke:currentColor;fill:transparent;display:block}"};export{e as default};
@@ -0,0 +1 @@
1
+ import e from"./ok-dropdown.ok.js";var o={tag:"ok-select",dependencies:[e],attr:{value:{default:null},options:{default:[]},optionText:{default:null},optionValue:{default:null},placeholder:{default:""},noSearch:{default:!1,empty:!0},placement:{default:"auto"}},context(e){let o=null,t=null,r=null;const l=o=>{if(null==o)return"";const t=e.$attr.optionText;return String("function"==typeof t?t(o):"string"==typeof t?o?.[t]??o:o)},n=o=>{if(null==o)return null;const t=e.$attr.optionValue;return"function"==typeof t?t(o):"string"==typeof t?o?.[t]??o:o},s=(e,o)=>{const t=e.filteredOptions;if(!t.length)return;const r=t.findIndex(o=>o===e.hover);e.hover=1===o?t[(r+1)%t.length]:t[(t.length+r-1)%t.length]};return{isOpen:!1,search:"",hover:null,get displayValue(){const o=e.$attr.value;if(null==o)return"";const t=(e.$attr.options??[]).find(e=>n(e)===o);return void 0!==t?l(t):""},get filteredOptions(){const o=e.$attr.options??[],t=this.search?.toLowerCase();return t?o.filter(e=>l(e).toLowerCase().includes(t)):o},getLabel:l,getValue:n,isSelected:o=>n(o)===e.$attr.value,open(){o?.toggle(!0)},close(){o?.toggle(!1)},toggle(e){(void 0!==e?e:!this.isOpen)?this.open():this.close()},onToggle(o){const l=!!o.detail?.open;if(this.isOpen=l,l){const o=this.filteredOptions;this.hover=o.find(e=>this.isSelected(e))??o[0]??null,this.search="",e.$attr.noSearch||e.$ok.nextFrame(()=>{(r??e.$el.querySelector(".ok-select__search"))?.focus()})}else this.search="",t?.focus();e.$dispatch("toggle",o.detail)},select(o){e.$dispatch("change",n(o)),this.close()},onFaceKeydown(e){if("ArrowDown"===e.key||"ArrowUp"===e.key){if(e.preventDefault(),!this.isOpen)return void this.open();s(this,"ArrowDown"===e.key?1:-1)}else if("Enter"===e.key||" "===e.key){if(e.preventDefault(),!this.isOpen)return void this.open();null!==this.hover&&this.select(this.hover)}else"Escape"===e.key&&(e.preventDefault(),this.close())},onSearchKeydown(e){"ArrowDown"===e.key||"ArrowUp"===e.key?(e.preventDefault(),s(this,"ArrowDown"===e.key?1:-1)):"Enter"===e.key?(e.preventDefault(),null!==this.hover&&this.select(this.hover)):"Escape"===e.key&&(e.preventDefault(),this.close())},setDropdownEl(e){o=e},setFaceEl(e){t=e},setSearchEl(e){r=e}}},mount(e){e.$el.toggle=o=>e.$context.toggle(o),e.$el.open=()=>e.$context.open(),e.$el.close=()=>e.$context.close()},template:'<ok-dropdown no-keyboard no-caret :placement="$props.placement" @mount="setDropdownEl($el)" @toggle="onToggle($event)"><template name="trigger"><div class="ok-select__face" @mount="setFaceEl($el)" role="combobox" tabindex="0" :aria-expanded="isOpen" aria-haspopup="listbox" @keydown:allow="onFaceKeydown($event)"><span class="ok-select__display" :class="{ \'ok-select__display--empty\': !displayValue }">{{ displayValue || $props.placeholder }} </span><span class="ok-select__caret" aria-hidden="true"><svg width="10" height="6" viewBox="0 0 10 6" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M1 1L5 5L9 1" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg></span></div></template><div class="ok-select__panel"><if :="!$props.noSearch"><div class="ok-select__search-wrap"><input class="ok-select__search" @mount="setSearchEl($el)" @unmounted="setSearchEl(null)" type="text" !value="search" @keydown:allow="onSearchKeydown($event)" autocomplete="off" placeholder="Search…"></div></if><div class="ok-select__options"><each :of="filteredOptions" let:option><div class="ok-select__option" role="option" :class="{ \'ok-select__option--selected\': isSelected(option),\n \'ok-select__option--hover\': hover === option }" @click="select(option)" @mouseenter="hover = option"><slot name="option" :var:option="option">{{ getLabel(option) }}</slot></div></each><if :="!filteredOptions.length"><div class="ok-select__empty"><slot name="empty">No results</slot></div></if></div></div></ok-dropdown>',style:"[tag]{display:inline-block;--ok-dropdown-trigger-display:flex;--ok-dropdown-trigger-padding:0;--ok-dropdown-trigger-border:none;--ok-dropdown-trigger-bg:transparent;--ok-dropdown-trigger-hover-bg:transparent;--ok-dropdown-trigger-active-bg:transparent;--ok-dropdown-trigger-gap:0}.ok-select__face{display:inline-flex;align-items:center;gap:var(--ok-select-trigger-gap, 0.35em);cursor:pointer;user-select:none;width:100%;min-width:var(--ok-select-width, 160px);justify-content:space-between;padding:var(--ok-select-padding, 0.35rem 0.6rem);border-radius:var(--ok-select-radius, var(--ok_radius, 4px));border:var(--ok-select-border, 1px solid color-mix(in srgb, currentColor 20%, transparent));background:var(--ok-select-bg, var(--ok_bg, #fff));color:inherit;font-size:inherit;font-family:inherit;outline-offset:0;transition:border-color .15s;box-sizing:border-box}.ok-select__face:hover{border-color:var(--ok-select-hover-border, color-mix(in srgb, currentColor 35%, transparent))}.ok-select__face:focus,[tag] .ok-dropdown--open .ok-select__face{border-color:var(--ok-select-focus-border, var(--ok_focus-ring, currentColor));outline:1px solid var(--ok-select-focus-border, var(--ok_focus_ring, currentColor))}.ok-select__display{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:start}.ok-select__display--empty{color:var(--ok-select-placeholder-color, color-mix(in srgb, currentColor 40%, transparent))}.ok-select__caret{display:inline-flex;align-items:center;flex-shrink:0;line-height:0;color:color-mix(in srgb,currentColor 55%,transparent);transition:transform .2s ease}[tag] .ok-dropdown--open .ok-select__caret{transform:rotate(180deg)}.ok-select__panel{min-width:var(--ok-select-width, 160px)}.ok-select__search-wrap{padding:.35rem .4rem .3rem;border-bottom:1px solid color-mix(in srgb,currentColor 8%,transparent)}.ok-select__search{display:block;width:100%;box-sizing:border-box;border:1px solid color-mix(in srgb,currentColor 15%,transparent);border-radius:calc(var(--ok-select-radius, var(--ok_radius, 4px)) - 1px);padding:.25rem .45rem;font-size:inherit;font-family:inherit;background:var(--ok-select-search-bg, color-mix(in srgb, currentColor 4%, transparent));color:inherit;outline:0}.ok-select__search:focus{border-color:var(--ok-select-focus-border, var(--ok_focus_ring, currentColor));outline:1px solid var(--ok-select-focus-border, var(--ok_focus_ring, currentColor));outline-offset:0}.ok-select__options{max-height:var(--ok-select-panel-height, 220px);overflow-y:auto;padding:.2rem 0}.ok-select__option{padding:.4rem .75rem;cursor:pointer;font-size:inherit;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:background .1s}.ok-select__option--hover,.ok-select__option--selected.ok-select__option--hover{background:var(--ok-select-option-hover-bg, color-mix(in srgb, currentColor 8%, transparent))}.ok-select__option--selected{background:var(--ok-select-option-selected-bg, color-mix(in srgb, currentColor 10%, transparent));font-weight:500}.ok-select__empty{padding:.5rem .75rem;color:color-mix(in srgb,currentColor 45%,transparent);font-style:italic;font-size:.875em}[tag].block{display:block}[tag].block .ok-select__face,[tag].block .ok-select__panel{width:100%;min-width:0}",plugins:{theme:{expose:{"--ok-select-width":{default:"160px",type:"length",description:"Minimum width of the select control",category:"ok-select"},"--ok-select-bg":{default:"var(--ok_bg, #fff)",type:"color",description:"Select trigger background",category:"ok-select"},"--ok-select-panel-height":{default:"220px",type:"length",description:"Maximum height of the scrollable options list",category:"ok-select"},"--ok-select-option-selected-bg":{default:"color-mix(in srgb, currentColor 10%, transparent)",type:"color",description:"Background of the selected option",category:"ok-select"}}}}};export{o as default};
@@ -0,0 +1 @@
1
+ function e(e){return{prop:e.prop??null,value:e.value??null,title:e.title??null,width:e.width??null,lock:!!e.lock,noResize:e.noResize??!1,headerTemplate:e.headerTemplate??c(),cellTemplate:e.cellTemplate??s(),source:e.source??"user",computedWidth:null,setWidth:null,_n:e._n??null,_hidden:e._hidden??null,_title:e._title??null}}function t(t,l){const n=[];for(const r of t)if(r?.auto){const t=o(l.$attr.data,{...r,...r.auto});for(const l of t)if("more"===l.source){const t=e(l);t._configEntry=r,n.push(t)}else n.push(e({...l,...r}))}else n.push(e(r));const r=n[n.length-1];return r&&"more"!==r.source&&(r.width="1fr"),n}function l(e){const t=document.createElement("template");return t.innerHTML=e,t}function o(e,{width:t="min-content",headerTemplate:o,cellTemplate:n,filter:r,map:a,sort:c,max:s=null,showMoreContent:i=null,showMoreTitle:d=null,_expanded:u=!1}){const m=new Set;for(const t of e)if(t&&"object"==typeof t)for(const e of Object.keys(t))m.add(e);let h=[];for(const e of m)r&&!r(e)||h.push({prop:e,width:t,computedWidth:null,noResize:!1,headerTemplate:o,cellTemplate:n,source:"auto"});if(a&&(h=h.map(e=>({...e,...a(e)}))),c&&(h=h.sort(c)),s&&!u&&h.length>s){const e=h.slice(s),t=e.length,o="function"==typeof i?String(i(t,e)):i??`+${t}`,n="function"==typeof d?String(d(t,e)):d;h=h.slice(0,s),h.push({prop:null,value:null,title:null,width:"min-content",computedWidth:null,noResize:!0,headerTemplate:l(o),cellTemplate:null,source:"more",_n:t,_hidden:e,_title:n})}return h}function n(e){if(!e)return null;const t=document.createElement("template");t.content.append(...e.childNodes);for(const l of e.attributes)l.name.startsWith("let:")&&t.setAttribute(l.name,l.value);return t}function r(e,t){const l=e.getAttribute("width")||"min-content",o=e.hasAttribute("max")?parseInt(e.getAttribute("max"),10):null,r=Array.from(e.children).find(e=>"HEADER"===e.tagName),a=Array.from(e.children).find(e=>"CELL"===e.tagName);let c=null;e.getAttribute(":filter")&&(c=t.$fn(e.getAttribute(":filter"))(t));let s=null;e.getAttribute(":sort")&&(s=t.$fn(e.getAttribute(":sort"))(t));let i=null;e.getAttribute(":map")&&(i=t.$fn(e.getAttribute(":map"))(t));let d=e.getAttribute("show-more-content");e.getAttribute(":show-more-content")&&(d=t.$fn(e.getAttribute(":show-more-content"))(t));let u=e.getAttribute("show-more-title");return e.getAttribute(":show-more-title")&&(u=t.$fn(e.getAttribute(":show-more-title"))(t)),{auto:{filter:c,sort:s,map:i},cellTemplate:n(a),headerTemplate:n(r),width:l,max:o,showMoreContent:d,showMoreTitle:u,columnEl:e}}function a(e,t){const l=e.getAttribute("prop")||null,o=Array.from(e.children).find(e=>"HEADER"===e.tagName),r=Array.from(e.children).find(e=>"CELL"===e.tagName);return{width:e.getAttribute("width")||"1fr",noResize:e.hasAttribute("no-resize"),prop:l,headerTemplate:n(o),cellTemplate:n(r),columnEl:e}}function c(e){const t=document.createElement("template");return t.setAttribute("let:column","column"),t.innerHTML="{{ column.title || column.prop || '' }}",t}function s(e){const t=document.createElement("template");return t.setAttribute("let:row","row"),t.setAttribute("let:column","column"),t.setAttribute("let:value","value"),t.innerHTML="{{ value || '' }}",t}var i={tag:"ok-table",attr:{data:{default:[]},columns:{default:null},expand:{default:"multi"},select:{default:"none"},selected:{default:null},expanded:{default:null}},plugins:{theme:{expose:{"--ok-table_bg":{type:"color",description:"Table background",category:"Colors"},"--ok-table_header-bg":{type:"color",description:"Header background",category:"Colors"},"--ok-table_color":{type:"color",description:"Text color",category:"Colors"},"--ok-table_hover-bg":{default:"color-mix(in srgb, var(--ok_color-accent-fg) 20%, transparent)",type:"color",description:"Row hover background",category:"Colors"},"--ok-table_selected-bg":{default:"color-mix(in srgb, var(--ok_color-accent-fg, #007bff) 25%, transparent)",type:"color",description:"Selected row background",category:"Colors"},"--ok-table_border":{type:"border",description:"Cell border",category:"Layout"},"--ok-table_padding":{type:"length",description:"Cell padding",category:"Layout"},"--ok-table_font":{type:"string",description:"Table font",category:"Typography"}}}},context(e){const l=e.$cache.cmp.templates.default;var n;e.$attr.columns&&(n=l,Array.from(n?.content?.children||[]).find(e=>"COLUMNS"===e.tagName||"AUTO"===e.tagName||"COLUMN"===e.tagName));const c=e.$attr.columns||function(e,t){const l=Array.from(e?.content?.children||[]).find(e=>"COLUMNS"===e.tagName),n=[];if(!l)return o(t.$attr.data,{});for(const e of l.children)"AUTO"===e.tagName?n.push(r(e,t)):"COLUMN"===e.tagName&&n.push(a(e));return n}(l,e);c.length||c.push({auto:!0});const s=t(c,e),i=Array.from(l?.content.children??[]).find(e=>"EXPANDED"===e.tagName);if(i){const t=document.createElement("template");t.content.append(...i.childNodes);for(const e of i.attributes)e.name.startsWith("let:")&&t.setAttribute(e.name,e.value);e.$cache.cmp.templates.expanded=t}return{get expand(){return e.$attr.expand||"multi"},get select(){return e.$attr.select||"none"},get canSelect(){return"none"!==this.select},_expandedRows:new Set,_selectedRows:new Set,get expandedRows(){return e.$attr.expanded??this._expandedRows},get selectedRows(){return e.$attr.selected??this._selectedRows},columnsConfig:c,columns:s,valueOf:(e,t)=>t.value?t.value(e):t.prop?e[t.prop]:void 0,showMore(l){l._configEntry._expanded=!0,this.columns=t(this.columnsConfig,e)},get columnStyle(){if(!this.columns.length)return"1fr";const e=this.columns.map(e=>`minmax(0, ${e.setWidth||e.computedWidth||e.width||"1fr"})`),t=e.length-1;return e[t]=`minmax(${this.columns[t].setWidth||0}, auto)`,e.join(" ")},get rows(){return e.$attr.data},resizeColumn:null,expandedRow:null,hoverRow:null,get canExpand(){return e.$cache.cmp.templates.expanded},wasExpanded(e){return this.expandedRows.has(e)},toggleExpand(t,l=null){if(!this.canExpand)return;const o=this.expandedRows.has(t),n=null===l?!o:!!l;"single"===this.expand&&this.expandedRows.clear(),n?this.expandedRows.add(t):this.expandedRows.delete(t),e.$dispatch("expand-change",{expanded:this.expandedRows,row:t,action:n?"expand":"collapse"})},isSelected(e){return this.selectedRows.has(e)},toggleSelect(t,l=null){if(!this.canSelect)return;const o=this.selectedRows.has(t),n=null===l?!o:!!l;"single"===this.select&&this.selectedRows.clear(),n?this.selectedRows.add(t):this.selectedRows.delete(t),e.$dispatch("select-change",{selected:this.selectedRows,row:t,action:n?"select":"deselect"})},handleRowClick(e){this.toggleExpand(e),this.canSelect&&this.toggleSelect(e)},resize(t,l){l.preventDefault(),this.resizeColumn=t,e.$el.getBoundingClientRect();const o=e.$el.querySelectorAll(".ok-table__cell--header")[this.columns.indexOf(t)],n=l.clientX,r=o.offsetWidth;if(!t.computedWidth){const t=e.$el.querySelectorAll(".ok-table__cell--header");this.columns.forEach((e,l)=>{if(!e.computedWidth){const o=t[l];o&&(e.computedWidth=`${o.offsetWidth}px`)}})}const a=e=>{const l=e.clientX-n,o=r+l;t.setWidth=`${o}px`},c=()=>{document.removeEventListener("mousemove",a),document.removeEventListener("mouseup",c),this.resizeColumn=null};document.addEventListener("mousemove",a),document.addEventListener("mouseup",c)}}},mounted(e){e.$watch(()=>e.$attr.data?.length,()=>{this.columns=t(this.columnsConfig,e)}),e.$el.select=(e,t)=>this.toggleSelect(e,t??!0),e.$el.deselect=e=>this.toggleSelect(e,!1),e.$el.toggleSelect=(e,t)=>this.toggleSelect(e,t??null),e.$el.clearSelection=()=>this.selectedRows.clear(),e.$el.getSelected=()=>this.selectedRows,e.$el.expand=(e,t)=>this.toggleExpand(e,t??!0),e.$el.collapse=e=>this.toggleExpand(e,!1),e.$el.toggleExpand=(e,t)=>this.toggleExpand(e,t??null),e.$el.clearExpanded=()=>this.expandedRows.clear(),e.$el.getExpanded=()=>this.expandedRows},mount(e){e.$cache.start=performance.now()},init(e){},template:'<div class="ok-table__container" :style="{ gridTemplateColumns: columnStyle }"><each :of="columns" let:item="column" let:index="columnIndex"><div class="ok-table__column ok-table__column--header"><if :="column.source === \'more\'"><div class="ok-table__cell ok-table__cell--header ok-table__cell--show-more" :title="column._title" @click="showMore(column)"><div class="ok-table__cell__inner"><slot :template="column.headerTemplate" :var:column="column"/></div></div><else><div class="ok-table__cell ok-table__cell--header"><div class="ok-table__cell__inner"><slot :template="column.headerTemplate" :var:column="column"/></div></div><if :="!column.noResize"><div class="ok-table__resizer ok-table__resizer--header" :class="{\'ok-table__resizer--resizing\': resizeColumn === column}" @mousedown="resize(column, $event)"/></if></else></if></div></each><each :of="rows" let:item="row" let:index="rowIndex"><each :of="columns" let:item="column" let:index="columnIndex"><if :="column.source === \'more\'"><div class="ok-table__cell ok-table__cell--data ok-table__cell--show-more"/><else><div class="ok-table__cell ok-table__cell--data" :class="{\n \'ok-table__cell--hover-row\': hoverRow === row,\n \'ok-table__cell--expanded\': expandedRows.has(row),\n \'ok-table__cell--selected\': selectedRows.has(row),\n \'ok-table__cell--start\': columnIndex === 0,\n \'ok-table__cell--end\': columnIndex === columns.length - 1\n }" @click="handleRowClick(row)" @mouseenter="hoverRow = row" @mouseleave="hoverRow = hoverRow === row ? null : hoverRow"><div class="ok-table__cell__inner"><slot :template="column.cellTemplate" :var:row="row" :var:column="column" :var:index="rowIndex" :var:value="valueOf(row, column)"/></div><if :="!column.noResize"><div class="ok-table__resizer ok-table__resizer--cell" :class="{ \'ok-table__resizer--resizing\': resizeColumn === column}" @mousedown="resize(column, $event)"/></if></div></else></if></each><if :="canExpand && wasExpanded(row)"><div class="ok-table__expanded_row"><slot name="expanded" :var:row="row" :var:index="rowIndex"/></div></if></each></div>',style:"[tag]{display:block;overflow:auto;max-width:100%}.ok-table__container{display:grid;grid-template-rows:auto;grid-auto-rows:auto;font-family:var(--ok-table-font);width:max-content;min-width:-webkit-fill-available}.ok-table__column--header{position:sticky;top:0;z-index:1}.ok-table__cell{color:var(--ok-table_color);border-bottom:var(--ok-table_border);white-space:nowrap;align-items:center;position:relative;background:var(--ok-table_bg);overflow:hidden;height:100%;box-sizing:border-box}.ok-table__cell__inner{padding:var(--ok-table_padding, 0.1rem 1rem);text-overflow:ellipsis;overflow:hidden}.ok-table__cell--header{font-weight:700;background:var(--ok-table_header-bg, var(--ok_bg-accent, rgba(0, 123, 255, 0.05)));border-bottom:var(--ok-table_border)}.ok-table__cell--hover-row{background:var(--ok-table_hover-bg, rgba(0, 123, 255, 0.1))}.ok-table__cell--selected{background:var(--ok-table_selected-bg, color-mix(in srgb, var(--ok_color-accent-fg, #007bff) 25%, transparent))}.ok-table__cell--expanded,.ok-table__cell--header.ok-table__cell--show-more:hover{background:var(--ok-table_hover-bg, rgba(0, 123, 255, 0.1))}.ok-table__cell--start{border-left:var(--ok-table_border)}.ok-table__cell--end{border-right:var(--ok-table_border)}.ok-table__resizer{position:absolute;right:0;top:0;bottom:0;width:6px;cursor:col-resize;z-index:10}.ok-table__resizer--resizing,.ok-table__resizer:hover{background:var(--ok_bg-accent-hover, rgba(0, 123, 255, 0.3))}.ok-table__expanded_row{grid-column:1/-1;contain:inline-size}.ok-table__cell--header.ok-table__cell--show-more{cursor:pointer;user-select:none;opacity:.7}.ok-table__cell--header.ok-table__cell--show-more:hover{opacity:1}.ok-table__cell--data.ok-table__cell--show-more{pointer-events:none}"};export{i as default};
@@ -0,0 +1 @@
1
+ var r={tag:"ok-crash-boundary",register(r){"dev"!==r.config.env||r.config.crash.boundary_component||(r.config.crash.boundary_component="ok-crash-boundary")},template:"<div><strong>Component Error</strong><pre>{{ $props.error?.rootCauseMessage || $props.error?.message || 'Something went wrong' }}</pre><button @click=\"$props.retry()\">Retry</button></div>",plugins:{theme:{expose:{"--ok-crash-boundary__bg":{default:"var(--ok-theme_color-error-bg, #2b0000)",type:"color",category:"Crash"},"--ok-crash-boundary_color":{default:"var(--ok-theme_color-error, #ffcfcf)",type:"color",category:"Crash"},"--ok-crash-boundary_border":{default:"1px solid var(--ok-theme_color-error-border, #ff4c4c)",type:"border",category:"Crash"},"--ok-crash-boundary_radius":{default:"var(--ok-theme_radius, 6px)",type:"length",category:"Crash"},"--ok-crash-boundary_font":{default:"monospace",type:"string",category:"Crash"},"--ok-crash-boundary_padding":{default:"var(--ok-theme_padding, 1em)",type:"length",category:"Crash"},"--ok-crash-boundary_button-bg":{default:"#440000",type:"color",category:"Crash"},"--ok-crash-boundary_button-color":{default:"var(--ok-bg, white)",type:"color",category:"Crash"},"--ok-crash-boundary_button-border":{default:"1px solid var(--ok-theme_border-color, #cc0000)",type:"border",category:"Crash"}}}},style:"[tag]{display:block;padding:var(--ok-crash-boundary_padding, 1em);background:var(--ok-crash-boundary_bg, #2b0000);color:var(--ok-crash-boundary_color, #ffcfcf);border:var(--ok-crash-boundary_border, 1px solid #ff4c4c);border-radius:var(--ok-crash-boundary_radius, 6px);font-family:var(--ok-crash-boundary_font, monospace)}[tag] button{margin-top:1em;background:var(--ok-crash-boundary_button-bg, #440000);color:var(--ok-crash-boundary_button-color, white);border:var(--ok-crash-boundary_button-border, 1px solid #cc0000);padding:.5em 1em;cursor:pointer}"};export{r as default};
@@ -0,0 +1 @@
1
+ import e from"../devtools/ok-js-tree.ok.js";var r={tag:"ok-crash-info",lazy:!0,dependencies:[e],attr:{noClose:{default:!1,empty:!0},error:{}},register(e){"dev"!==e.config.env||e.config.crash.component||(e.config.crash.component="ok-crash-info")},context:e=>(e.$attr.level||e.$el.classList.toggle("root"),{get error(){return"string"==typeof e.$attr.error?{message:e.$attr.error}:e.$attr.error||{}},get level(){return e.$attr.level||0},get node(){return this.error.node||this.error.scope?.$el||this.error.meta?.node},get isCmp(){return(this.error.scope||this.node.$scope)?.$cache.cmp},get cmp(){return(this.error.scope||this.node)?.$scope?.$cmp},stringify(e){try{return JSON.stringify(e,(e,r)=>"function"==typeof r?"[Function]":r,2)}catch{return"[Circular]"}},escape:e=>e,truncateOuterTag(e){if(!e)return"[NO NODE]";if(e.nodeType!==Node.ELEMENT_NODE)return e.nodeType===Node.TEXT_NODE?e.$scope?.$cache?.text?.cmd?'BOUND TEXT: "'+e.textContent.trim()+'" Expression: "'+e.$scope.$cache.text.cmd+'"':"TEXT NODE: "+e.textContent.trim():void 0;const r=e.tagName.toLowerCase(),t=Array.from(e.attributes).map(e=>`${e.name}="${e.value}"`).join(" ");return`<${r}${t?" "+t:""}>...</${r}>`},outer(e){return this.truncateOuterTag(e)},inspect(r){e.$ok.shared.highlight.show(r),(r.$scope||e).$ok.shared.inspector.inspect(r)},close(){e.$dispatch("close")},get causeChain(){return e.$memo(()=>{const e=[];let r=this.error;for(;r;){const t=r.scope,o=t?.$el.tagName||(t?.$el.nodeType===Node.TEXT_NODE?"[text]":"[unknown]");t!==e.at(-1)?.scope&&e.push({tag:o,collapsed:!0,preview:this.truncateOuterTag(t?.$el),scope:t,error:r}),r=r.cause}return e.length&&(e[0].collapsed=!1,e.at(-1).collapsed=!1),e}).value},scrollToError(e){const r=document.getElementById(e);if(!r)return;let t=r;for(;t;){if(t.classList?.contains("error-info-container")){const e=t.closest("details");e&&(e.open=!0)}t=t.parentElement}r.scrollIntoView({behavior:"smooth",block:"center"})}}),template:'<div class="error-info-container" :id="error.id"><if :="!level && !$props.noClose"><button class="error-info-close" @click="close">×</button></if><details :open="!level"><summary><strong>{{ level ? \'Cause: \' : \'\'}}{{ escape(error.name || \'Error\') }}</strong>{{ error.code ? \' [\' + escape(error.code) + \']\' : \'\' }} {{ escape(error.message) }}</summary><div :style="level ? \'margin-left:\' + (level ? 16 : 0) + \'px; padding-left:10px; border-left: 2px solid #ccc;\' : \'\'"><if :="cmp"><div class="error-info-cmp"><strong>Component:</strong> <code>{{ cmp?.$cache.cmp.def.tag }}</code><if :="cmp.$cache.cmp.def.url">(<a :href="cmp.$cache.cmp.def.url" target="_blank" class="error-info-link"> {{ cmp.$cache.cmp.def.url?.startsWith(location.origin) ? cmp.$cache.cmp.def.url?.slice(location.origin.length) : cmp.$cache.cmp.def.url }} </a>)</if></div></if><if :="!level && causeChain.length > 1"><div class="error-info-breadcrumbs"><each :of="causeChain.slice().reverse()" let:items let:item let:index><if :="item.collapsed && index === 1">→ <button class="crumb collapsed" @click="items.forEach(i => {i.collapsed = false})">…</button><else if="!item.collapsed"><if :="index > 0">→</if><span class="crumb" :title="item.preview"><a href="javascript:" @click="() => scrollToError(item.error.id)"><code>{{ item.tag }}</code></a><if :="item.scope"><button class="crumb-inspect" @click="inspect(item.scope?.$el)" title="Inspect">🔍</button></if></span></else></if></each></div></if><if :="node"><details open><summary><strong>Node</strong> <button @click="inspect(node)">Inspect</button></summary><pre style="background:#eee;padding:5px">{{ outer(node) }}</pre></details></if><if :="error.scope"><details><summary><strong>Scope</strong></summary><each :of="error.scope" let:key let:item><ok-js-tree :key :item :parent="error.scope"/></each></details></if><if :="Object.keys(error.meta || {}).length"><details open><summary><strong>Meta</strong></summary><each :of="error.meta" let:key let:item><div style="margin:4px 0;margin-left:12px;font-size:12px"><span style="display:inline-block;min-width:80px"><strong>{{ escape(key) }}:</strong></span><if :="item instanceof Node && item.nodeType === 1"><pre style="display:inline-block;margin-left:6px">{{ outer(item) }}</pre><button @click="inspect(item)">Inspect</button><else><pre style="display:inline-block;margin-left:6px">{{ escape(stringify(item)) }}</pre></else></if></div></each></details></if><if :="error.stack"><details open><summary><strong>Stack</strong></summary><pre style="font-size:12px;background:#f9f9f9;padding:5px">{{ escape(error.stack) }}</pre></details></if><if :="error.cause"><ok-crash-info :error="error.cause" :level="level + 1"/></if></div></details></div>',style:"[tag].root{display:block;background:#fff3f3;color:#333;border-left:5px solid #f44336;padding:20px;font-family:Arial,sans-serif;box-shadow:0 4px 6px rgba(0,0,0,.1);max-height:90vh;overflow:auto}[tag] .error-info-close{position:absolute;top:8px;right:12px;background:0 0;border:0;font-size:18px;line-height:1;cursor:pointer;color:#900;font-weight:700}[tag] .error-info-close:hover{color:red}[tag] .error-info-container{position:relative}[tag] .error-info-cmp{margin:10px 0;font-size:14px;color:#222}[tag] .error-info-cmp code{background:#eee;padding:2px 6px;border-radius:3px;font-size:13px}[tag] .error-info-link{color:#06c;text-decoration:underline;word-break:break-all}[tag] .error-info-link:hover{color:#00a}[tag] .crumb.collapsed{overflow:hidden;color:#aaa;width:auto;font-weight:700;padding:0 4px}"};export{r as default};
@@ -0,0 +1 @@
1
+ var e={tag:"i18n-editor-examples",template:'<div class="ast-examples-global"><details><summary>AST Format Examples</summary><div class="example-list"><div class="example"><strong>Simple text:</strong> <code>"Hello world"</code></div><div class="example"><strong>Text with variable:</strong> <code>"Hello \\{{username}}"</code></div><div class="example"><strong>Plural (string-only options):</strong> <code>{"var": "count", "format": "plural", "options": {"=0": "no items", "one": "1 item", "other": "\\{{count}} items"}}</code></div><div class="example"><strong>Select/Switch:</strong> <code>{"var": "gender", "format": "select", "options": {"male": "He likes this", "female": "She likes this", "other": "They like this"}}</code></div><div class="example"><strong>Formatted number:</strong> <code>"Price: \\{{price|currency:USD}}"</code></div><div class="example"><strong>Complex example:</strong> <code>["You have ", {"var": "count", "format": "plural", "options": {"=0": "no messages", "other": "\\{{count}} messages from \\{{sender}}"}}, " in your inbox"]</code></div></div></details></div>'};export{e as default};
@@ -0,0 +1 @@
1
+ import e from"../theming/ok-design.ok.js";import t from"../modals/ok-window.ok.js";import s from"./i18n-key-editor.ok.js";import n from"./i18n-editor-examples.ok.js";var a={tag:"i18n-editor",dependencies:[e,{tag:"i18n-service"},{tag:"i18n-editor-service",dependencies:[t,{tag:"ok-hotkeys-service"}],register(e,t){e.componentRegistry.cache.has(this.tag.toUpperCase())||e.register(this),e.shared.i18nEditor||(e.proxy({}),e.shared.i18nEditor={},e.shared.hotkeys.register(["ctrl","alt","l"],{description:"Translate",keydown(s){s.repeat||e.shared.layer.toggle("i18n-editor-service",!0,{registration:t,tier:"window"})}}))},template:"<ok-window no-portal @close=\"$ok.shared.layer.toggle('i18n-editor-service', false)\"><i18n-editor/></ok-window>"},s,n],context:e=>({extracted:null,defaultLang:"en",selectedLang:null,langs:new Set,namespaces:new Set,selectedNs:null,keys:new Set,hasKey(t,s,n){if(n)return!!(e.$ok.shared.i18n.core._catalogs[n]&&e.$ok.shared.i18n.core._catalogs[n][s]&&e.$ok.shared.i18n.core._catalogs[n][s][t]);if(s){for(const n of Object.keys(e.$ok.shared.i18n.core._catalogs))if(e.$ok.shared.i18n.core._catalogs[n][s]&&e.$ok.shared.i18n.core._catalogs[n][s][t])return!0;return!1}for(const s of Object.keys(e.$ok.shared.i18n.core._catalogs))for(const n of Object.keys(e.$ok.shared.i18n.core._catalogs[s]))if(e.$ok.shared.i18n.core._catalogs[s][n]&&e.$ok.shared.i18n.core._catalogs[s][n][t])return!0;return!1},get data(){return e.$memo(()=>{const t={};for(let s of this.keys)this.hasKey(s,this.selectedNs,this.selectedLang)&&(t[s]={key:s,value:e.$ok.shared.i18n.core._catalogs[this.selectedLang]?.[this.selectedNs]?.[s],default:e.$ok.shared.i18n.core._catalogs[this.defaultLang]?.[this.selectedNs]?.[s]});return Object.values(t)}).value},init(){for(const[t,s]of Object.entries(e.$ok.shared.i18n.core._catalogs)){this.langs.add(t);for(const[s,n]of Object.entries(e.$ok.shared.i18n.core._catalogs[t])){this.namespaces.add(s);for(const e of Object.keys(n))this.keys.add(e)}}this.langs.size>0&&!this.selectedLang&&(this.selectedLang=this.langs.has(this.defaultLang)?this.defaultLang:[...this.langs][0]),this.namespaces.size>0&&!this.selectedNs&&(this.selectedNs=this.namespaces.has("default")?"default":[...this.namespaces][0]),e.$ok.proxyInstance.notify(()=>this.keys)},updateTranslation(t,s){const n=e.$ok.shared.i18n.core._catalogs;n[this.selectedLang]||(n[this.selectedLang]={}),n[this.selectedLang][this.selectedNs]||(n[this.selectedLang][this.selectedNs]={}),n[this.selectedLang][this.selectedNs][t]=s,e.$ok.proxyInstance.notify(()=>n)}}),mounted(e){this.init()},template:'\n <div class="i18n-editor">\n <div class="editor-header">\n <h3>i18n Translation Editor</h3>\n <div class="selection-controls">\n <div class="lang-selector">\n <label>Language:</label>\n <each :="langs" let:item>\n <button @click="selectedLang = item" :class="{ active: selectedLang === item }">\n {{ item }}\n </button>\n </each>\n </div>\n \n <div class="ns-selector">\n <label>Namespace:</label>\n <each :="namespaces" let:item>\n <button @click="selectedNs = item" :class="{ active: selectedNs === item }">\n {{ item }}\n </button>\n </each>\n </div>\n </div>\n </div>\n \n <i18n-editor-examples />\n \n <if :="selectedLang && selectedNs">\n <div class="editor-content">\n <div class="current-selection">\n Editing: <strong>{{ selectedLang }}/{{ selectedNs }}</strong>\n </div>\n \n <div class="keys-list">\n <each :="data" let:item>\n <i18n-key-editor \n :value="item.value"\n :default="item.default" \n :key-name="item.key"\n :defaultLang="defaultLang"\n @change="updateTranslation(item.key, $event)"\n />\n </each>\n \n <if :="data.length === 0">\n <div class="no-keys">\n No translation keys found for {{ selectedLang }}/{{ selectedNs }}\n </div>\n </if>\n </div>\n </div>\n </if>\n \n <if :="!selectedLang || !selectedNs">\n <div class="no-selection">\n Please select a language and namespace to begin editing.\n </div>\n </if>\n </div>\n '};export{a as default};
@@ -0,0 +1 @@
1
+ var e={tag:"i18n-key-editor-tips",template:'<details class="i18n-key-editor-tips"><summary>💡 AST Format Tips</summary><ul><li><strong>Simple variable:</strong> <code>{"var": "username"}</code></li><li><strong>Formatted variable:</strong> <code>{"var": "price", "format": "currency:USD"}</code></li><li><strong>Plural forms:</strong> <code>{"var": "count", "format": "plural", "options": {"=0": "no items", "one": "1 item", "other": "\\{\\{count\\}\\} items"}}</code></li><li><strong>Select/Switch:</strong> <code>{"var": "gender", "format": "select", "options": {"male": "He", "female": "She", "other": "They"}}</code></li><li><strong>Array format:</strong> <code>["You have ", {"var": "count"}, " items"]</code></li><li><strong>String-only options:</strong> Options in plural/select must be strings with \\{\\{variable\\}\\} interpolation</li></ul></details>'};export{e as default};
@@ -0,0 +1 @@
1
+ import e from"./i18n-key-editor-tips.ok.js";var t={tag:"i18n-key-editor",dependencies:[e],attr:{value:{},default:{},keyName:{type:"string",required:!0},defaultLang:{type:"string",default:"en"}},events:["change"],context:e=>({jsonMode:!1,showTips:!1,selectedIndex:null,get segments(){const t=e.$attr.value;return t?Array.isArray(t)?JSON.parse(JSON.stringify(t)):"string"==typeof t||"object"==typeof t?[t]:[]:[]},get defaultText(){const t=e.$attr.default;return t?"string"==typeof t?t:JSON.stringify(t):""},get jsonValue(){const t=e.$attr.value??"";try{return JSON.stringify(t,null,2)}catch{return'""'}},emitSegments(t){let s;s=0===t.length?"":1===t.length&&"string"==typeof t[0]?t[0]:t,e.$emit("change",s)},selectSegment(e){this.selectedIndex=e},get selectedSegment(){return null!=this.selectedIndex?this.segments[this.selectedIndex]:null},updateFromJson(t){try{const s=JSON.parse(t);e.$emit("change",s)}catch(e){}},addTextSegment(){const e=this.segments;e.push(""),this.emitSegments(e),this.selectedIndex=e.length-1},addVariableSegment(){const e=this.segments;e.push({var:"name"}),this.emitSegments(e),this.selectedIndex=e.length-1},addPluralSegment(){const e=this.segments;e.push({var:"count",format:"plural",options:{"=0":"no items",one:"1 item",other:"{{count}} items"}}),this.emitSegments(e),this.selectedIndex=e.length-1},addSelectSegment(){const e=this.segments;e.push({var:"gender",format:"select",options:{male:"He",female:"She",other:"They"}}),this.emitSegments(e),this.selectedIndex=e.length-1},removeSegment(e){const t=this.segments;e>=0&&e<t.length&&(t.splice(e,1),this.emitSegments(t),this.selectedIndex===e?this.selectedIndex=null:this.selectedIndex>e&&this.selectedIndex--)},moveSegment(e,t){const s=this.segments,n=e+t;if(n>=0&&n<s.length){const t=s.splice(e,1)[0];s.splice(n,0,t),this.emitSegments(s),this.selectedIndex===e&&(this.selectedIndex=n)}},updateTextSegment(e,t){const s=this.segments;e>=0&&e<s.length&&(s[e]=t,this.emitSegments(s))},updateVariableName(e,t){const s=this.segments,n=s[e];n&&"object"==typeof n&&(n.var=t,this.emitSegments(s))},updateVariableFormat(e,t){const s=this.segments,n=s[e];n&&"object"==typeof n&&(t?"plural"===t?(n.format="plural",n.options=n.options||{"=0":"no items",one:"1 item",other:"{{count}} items"}):"select"===t?(n.format="select",n.options=n.options||{male:"He",female:"She",other:"They"}):(n.format=t,delete n.options):(delete n.format,delete n.options),this.emitSegments(s))},updateOption(e,t,s){const n=this.segments,i=n[e];i&&i.options&&(i.options[t]=s,this.emitSegments(n))},addOption(e){const t=this.segments,s=t[e];if(s&&s.options){let e="new",n=1;for(;s.options[e];)e="new"+n++;s.options[e]="",this.emitSegments(t)}},removeOption(e,t){const s=this.segments,n=s[e];n&&n.options&&(delete n.options[t],this.emitSegments(s))},renameOptionKey(e,t,s){const n=this.segments,i=n[e];if(i&&i.options&&t!==s){const e=i.options[t];delete i.options[t],s&&!i.options[s]&&(i.options[s]=e),this.emitSegments(n)}},getSegmentType:e=>"string"==typeof e?"Text":e.format?e.format.charAt(0).toUpperCase()+e.format.slice(1):"Variable",getSegmentClass(e){return this.getSegmentType(e).toLowerCase()}}),template:'<div class="i18n-key-editor"><div class="key-header"><strong>{{ $props.keyName }}</strong><div class="header-controls"><button @click="jsonMode = !jsonMode" :class="{active: jsonMode}">{{ jsonMode ? \'Visual\' : \'JSON\' }}</button> <button @click="showTips = !showTips" :class="{active: showTips}">💡 Tips</button></div></div><if :="defaultText"><div class="default-value"><small>Default ({{ $props.defaultLang }}): {{ defaultText }}</small></div></if><if :="jsonMode"><div class="json-editor"><label>JSON AST:</label> <textarea :value="jsonValue" @input="updateFromJson($event.target.value)" rows="8" spellcheck="false" class="json-textarea"/></div></if><if :="!jsonMode"><div class="visual-editor"><div class="toolbar"><button @click="addTextSegment()">+ Text</button> <button @click="addVariableSegment()">+ Variable</button> <button @click="addPluralSegment()">+ Plural</button> <button @click="addSelectSegment()">+ Select</button></div><div class="segments-inline"><each :="segments" let:item="segment" let:index><button class="segment-chip" :class="{ selected: selectedIndex === index }" @click="selectSegment(index)"><span class="chip-type">{{ getSegmentType(segment) }}</span><if :="typeof segment === \'object\'"><span class="chip-meta">{{ segment.var }}</span></if><if :="typeof segment === \'string\'"><span class="chip-meta">"{{ segment.length > 16 ? segment.slice(0,16) + \'…\' : segment }}"</span></if></button></each><if :="segments.length === 0"><span class="empty-message">No segments. Use the toolbar to add.</span></if></div><if :="selectedSegment != null"><div class="segment-editor"><div class="editor-header"><h5>Editing: {{ getSegmentType(selectedSegment) }}</h5><div class="editor-controls"><button @click="moveSegment(selectedIndex, -1)" :disabled="selectedIndex === 0">←</button> <button @click="moveSegment(selectedIndex, 1)" :disabled="selectedIndex === segments.length - 1">→</button> <button @click="removeSegment(selectedIndex)" class="remove">Delete</button> <button @click="selectedIndex = null">Done</button></div></div><if :="typeof selectedSegment === \'string\'"><div class="text-segment"><label>Text:</label> <textarea :value="selectedSegment" @input="updateTextSegment(selectedIndex, $event.target.value)" rows="3"/></div></if><if :="typeof selectedSegment === \'object\'"><div class="variable-segment"><div class="field"><label>Variable:</label> <input type="text" :value="selectedSegment.var" @input="updateVariableName(selectedIndex, $event.target.value)" placeholder="variable name"></div><div class="field"><label>Format:</label> <select :value="selectedSegment.format || \'\'" @change="updateVariableFormat(selectedIndex, $event.target.value)"><option value="">Raw Variable</option><option value="plural">Plural</option><option value="select">Select</option><option value="number">Number</option><option value="currency:USD">Currency (USD)</option><option value="currency:EUR">Currency (EUR)</option><option value="percent">Percent</option><option value="date:short">Date (Short)</option><option value="date:medium">Date (Medium)</option><option value="date:long">Date (Long)</option><option value="time:short">Time (Short)</option><option value="time:medium">Time (Medium)</option></select></div><if :="selectedSegment?.options"><div class="options-editor"><div class="options-header"><label>Options:</label> <button @click="addOption(selectedIndex)">+ Add</button></div><div class="options-list"><each :="Object.entries(selectedSegment.options)" let:item="option"><div class="option-row"><input type="text" :value="option[0]" @input="renameOptionKey(selectedIndex, option[0], $event.target.value)" class="option-key" placeholder="key"><input type="text" :value="option[1]" @input="updateOption(selectedIndex, option[0], $event.target.value)" class="option-value" placeholder="value (strings with {{var}})"><button @click="removeOption(selectedIndex, option[0])" class="remove">×</button></div></each></div></div></if></div></if></div></if></div></if><if :="showTips"><i18n-key-editor-tips/></if></div>'};export{t as default};
@@ -0,0 +1 @@
1
+ import{createI18n as e}from"./ok-i18n.js";var n={tag:"i18n-service",register(n){const t=e({}),a=n.proxy({lang:"en"});n.shared.i18n={core:t,get lang(){return a.lang},set lang(e){a.lang=e,t.lang=e},t:(e,n,r)=>t.t(e,n,{lang:a.lang,...r})},n.enhanceScope(e=>{Object.defineProperty(e,"$t",{get:()=>(n,t,a)=>e.$ok.shared.i18n.t(n,t,a)})})}};export{n as default};
@@ -0,0 +1 @@
1
+ function e(e={}){const t={},r={},n={includeBase:!0,fallbacks:[],missing:"placeholder",placeholder:e=>`#${e}#`,coerceNumbers:!0,currencyDefault:"USD",warnOnMissingOther:!1,onWarn:null,onMissingKey:null,onMissingVar:null},l=t=>({...n,...e,...t}),i=(e,t)=>t.split(".").reduce((e,t)=>e?.[t],e);function o(e,t,r){return(e=(e=e.replace(/{{{{/g,"").replace(/}}}}/g,"")).replace(/{{\s*([^{}]+?)\s*}}/g,(e,n)=>{const l=n.trim(),o=r.onMissingVar?.(l,t);if(null!=o)return String(o);const a=i(t,l);if(null==a){if("placeholder"===r.missing)return r.placeholder(l);if("throw"===r.missing)throw new Error(`i18n: missing "${l}"`);return""}return String(a)})).replaceAll("","{{").replaceAll("","}}")}const a=e=>!e||0===Object.keys(e).length;function s(e,t,r,n){if(null==e)return"";if("string"==typeof e)return e.includes("{{")?o(e,t,n):e;if(Array.isArray(e))return e.map(e=>s(e,t,r,n)).join("");if(!("var"in e))return n.onWarn?.("bad_segment",{node:e}),"";const{var:l,format:u,options:c={}}=e,m=i(t??{},l),y=(e=>{if(!e)return{type:"raw"};const[t,r]=String(e).split(":");return"currency"===t?{type:"number",style:"currency",currency:r}:"percent"===t?{type:"number",style:"percent"}:"number"===t?{type:"number",style:r||"default"}:"date"===t?{type:"date",style:r||"medium"}:"time"===t?{type:"time",style:r||"short"}:"select"===t||"switch"===t?{type:"select"}:"plural"===t?{type:"plural"}:"ordinal"===t?{type:"ordinal"}:{type:"raw"}})(u);switch(!n.warnOnMissingOther||"select"!==y.type&&"plural"!==y.type&&"ordinal"!==y.type||"other"in c||n.onWarn?.("missing_other",{path:l,lang:r.locale}),y.type){case"raw":if(null==m){if("throw"===n.missing)throw new Error(`i18n: missing "${l}"`);return"placeholder"===n.missing?n.placeholder(l):""}return String(m);case"number":if("integer"===y.style)return r.numberInt.format(m);if("percent"===y.style)return r.numberPct.format(m);if("currency"===y.style){const e=c.currency??y.currency??t?.currency??n.currencyDefault;return r.currency(e,c).format(m)}return new Intl.NumberFormat(r.locale,c).format(m);case"date":return a(c)?r.date[y.style].format(m):new Intl.DateTimeFormat(r.locale,{dateStyle:y.style,...c}).format(m);case"time":return a(c)?r.time[y.style].format(m):new Intl.DateTimeFormat(r.locale,{timeStyle:y.style,...c}).format(m);case"select":{const e=null==m?void 0:String(m),r=e&&c[e]||c.other||"";return"string"!=typeof r?(n.onWarn?.("invalid_option_type",{path:l,key:e,type:typeof r}),""):r.includes("{{")?o(r,t,n):r}case"plural":{let e="number"==typeof m?m:n.coerceNumbers?Number(m):NaN;if(!Number.isFinite(e)){const e=c.other??"";return"string"!=typeof e?(n.onWarn?.("invalid_option_type",{path:l,key:"other",type:typeof e}),""):e.includes("{{")?o(e,t,n):e}const i=c[`=${e}`];if(i)return"string"!=typeof i?(n.onWarn?.("invalid_option_type",{path:l,key:`=${e}`,type:typeof i}),""):i.includes("{{")?o(i,t,n):i;const a=r.cardinal.select(e),s=c[a]??c.other??"";return"string"!=typeof s?(n.onWarn?.("invalid_option_type",{path:l,key:a,type:typeof s}),""):s.includes("{{")?o(s,t,n):s}case"ordinal":{let e="number"==typeof m?m:n.coerceNumbers?Number(m):NaN;if(!Number.isFinite(e)){const e=c.other??"";return"string"!=typeof e?(n.onWarn?.("invalid_option_type",{path:l,key:"other",type:typeof e}),""):e.includes("{{")?o(e,t,n):e}const i=r.ordinal.select(e),a=c[i]??c.other??"";return"string"!=typeof a?(n.onWarn?.("invalid_option_type",{path:l,key:i,type:typeof a}),""):a.includes("{{")?o(a,t,n):a}default:return n.onWarn?.("bad_format",{format:u}),""}}return{register(e,r,n){t[r]??={},t[r][e]={...t[r][e]||{},...n}},t(e,r={},n={}){const i=l(n),{lang:o,ns:a="default"}=i;if(!o)throw new Error("i18n: lang is required.");let s=function(e,r,n,l){const i=l.includeBase&&e?.includes("-")?e.split("-")[0]:e,o=[...new Set([e,l.includeBase?i:null,...l.fallbacks].filter(Boolean))];for(const e of o){const l=t[e]?.[r]?.[n];if(null!=l)return l}return null}(o,a,e,i);if(null==s&&i.onMissingKey&&(s=i.onMissingKey(e,{lang:o,ns:a})??null),null==s){if("placeholder"===i.missing)return i.placeholder(e);if("throw"===i.missing)throw new Error(`i18n: missing key "${e}" for ${o}/${a}`);return""}return this.renderMessage(s,r,i)},renderMessage(e,t={},n={}){const i=l(n),{lang:o}=i;if(!o)throw new Error("i18n: lang is required.");return s(e,t,function(e){if(r[e])return r[e];const t={short:new Intl.DateTimeFormat(e,{dateStyle:"short"}),medium:new Intl.DateTimeFormat(e,{dateStyle:"medium"}),long:new Intl.DateTimeFormat(e,{dateStyle:"long"}),full:new Intl.DateTimeFormat(e,{dateStyle:"full"})},n={short:new Intl.DateTimeFormat(e,{timeStyle:"short"}),medium:new Intl.DateTimeFormat(e,{timeStyle:"medium"}),long:new Intl.DateTimeFormat(e,{timeStyle:"long"}),full:new Intl.DateTimeFormat(e,{timeStyle:"full"})},l=Object.create(null),i={locale:e,numberDefault:new Intl.NumberFormat(e),numberInt:new Intl.NumberFormat(e,{maximumFractionDigits:0}),numberPct:new Intl.NumberFormat(e,{style:"percent"}),currency:(t,r)=>r&&Object.keys(r).length?new Intl.NumberFormat(e,{style:"currency",currency:t,...r}):l[t]??=new Intl.NumberFormat(e,{style:"currency",currency:t}),date:t,time:n,cardinal:new Intl.PluralRules(e),ordinal:new Intl.PluralRules(e,{type:"ordinal"})};return r[e]=i,i}(o),i)},_catalogs:t,_fmtCache:r}}export{e as createI18n};
@@ -0,0 +1 @@
1
+ import e from"../core/ok-overlay.ok.js";import t from"../core/ok-layer-service.ok.js";import o from"./ok-dismiss-service.ok.js";var n={tag:"ok-contextmenu",dependencies:[e,t,o],register(e,t){let o=null;e.shared.contextmenu=e.proxy({visible:!1,x:0,y:0,zIndex:3200,options:null,async show(n){this.visible&&await this.close();const r=e.shared.layer,s=n.anchor||n.target?.currentTarget||n.target?.target||n.target;this.zIndex=r?.resolveLocalZ?.(n.layer??"contextmenu")??3200,await r.toggle("ok-contextmenu",!0,{registration:t,layer:n.layer??"contextmenu",owner:s}),this.x=n.target.clientX,this.y=n.target.clientY,this.options=n,this.visible=!0,o?.stop(),o=e.shared.dismiss.register({surfaces:()=>document.querySelector("ok-contextmenu"),outsideAction:"close",onDismiss:()=>{e.shared.contextmenu.close()}}),document.addEventListener("wheel",this.swallowScroll,{passive:!1})},swallowScroll(e){e.preventDefault(),e.stopPropagation()},async close(){this.visible=!1,this.template="",this.context={},this.x=0,this.y=0,this.zIndex=e.shared.layer?.resolveLocalZ("contextmenu")??3200,this.nodes=[],this.options?.close?.(),o?.stop(),o=null,document.removeEventListener("wheel",this.swallowScroll),await e.shared.layer.toggle("ok-contextmenu",!1)},async passthroughContextmenu(t){t.stopPropagation();const{clientX:o,clientY:n}=t,r=t.target,s=(document.elementsFromPoint(o,n)||[]).find(e=>!r||!r.contains(e));if(s){await this.close(),await e.awaitFrame();const o=new MouseEvent("contextmenu",{bubbles:!0,cancelable:!0,composed:!0,clientX:t.clientX,clientY:t.clientY,screenX:t.screenX,screenY:t.screenY,button:t.button,buttons:t.buttons,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,altKey:t.altKey,metaKey:t.metaKey,pointerId:t.pointerId,pointerType:t.pointerType,isPrimary:t.isPrimary,pressure:t.pressure,tiltX:t.tiltX,tiltY:t.tiltY,view:window});o._okPassthrough=!0,s.dispatchEvent(o)}}})},context(e){const t=e.$ok.shared.contextmenu;return e.$watch(()=>t.zIndex,t=>{e.$el.style.zIndex=String(t||e.$ok.shared.layer?.resolveLocalZ("contextmenu")||3200)}),e.$ok.shared.contextmenu},template:'<if :="visible"><ok-overlay :style="{ \'--ok-overlay_bg\': \'var(--ok-contextmenu_overlay-bg)\', \'--ok-overlay_z\': \'var(--ok-contextmenu_overlay-z)\'}" @request-close="close" @contextmenu="passthroughContextmenu"><div class="ok-contextmenu" role="menu" :style="{ left: x + \'px\', top: y + \'px\' }" @contextmenu="()=>{}"><fragment :nodes="$ok.createNodes(options.template)" :context="options.context || {}"/></div></ok-overlay></if>',style:"[tag]{position:fixed;inset:0;z-index:var(--ok-contextmenu_z, 3200);pointer-events:auto;--ok-overlay_bg:var(--ok-contextmenu_overlay-bg, transparent)}.ok-contextmenu{position:fixed;left:0;top:0;min-width:max-content;max-width:90vw;max-height:80vh;overflow:auto;border:var(--ok-contextmenu_border, 0);border-radius:var(--ok-contextmenu_radius, 0);box-shadow:var(--ok-contextmenu_shadow)}",plugins:{theme:{expose:{"--ok-contextmenu_overlay-bg":{default:"transparent",type:"color",category:"Overlay",description:"Backdrop bg"},"--ok-contextmenu_border":{type:"border",category:"Overlay"},"--ok-contextmenu_radius":{type:"length",category:"Overlay"},"--ok-contextmenu_shadow":{default:"var(--ok_shadow)",type:"box-shadow",category:"Overlay"},"--ok-contextmenu_z":{type:"number",category:"Layout",description:"z-index token"}}}}};export{n as default};
@@ -0,0 +1 @@
1
+ var e={tag:"ok-dismiss-service",register(e){if(e.shared.dismiss?.__okDismissService)return;const n=[];let t=!1,s=null;const o=e=>{const n="function"==typeof e?e():e;return null==n?[]:Array.isArray(n)?n:[n]},i=(e,n)=>{const t=(s=e)?s instanceof Element?s:s.currentTarget instanceof Element?s.currentTarget:s.target instanceof Element?s.target:null:null;var s;return!!t&&!!n&&(t===n||t.contains?.(n))},r=(e,n=void 0)=>("function"==typeof e?e():e)??n,c=e=>{e.preventDefault?.(),e.stopPropagation?.(),e.stopImmediatePropagation?.()},l=()=>{for(let e=n.length-1;e>=0;e--)!1===n[e].active&&n.splice(e,1);f()},a=(e,n)=>{const t=(e=>e.composedPath?.()[0]??e.target)(n);return o(e.surfaces).some(e=>i(e,t))||o(e.anchors).some(e=>i(e,t))||i(e.owner,t)},u=e=>{l();for(let t=n.length-1;t>=0;t--){const o=n[t];if(!1===o.active||!1===r(o.enabled,!0))continue;if(a(o,e))return;const i=r(o.outsideAction,"close");if("pass-through"!==i&&"click-through"!==i){if("close"===i){const n=o.onDismiss?.(e,o);if(!1===n)return}return o.swallowing=!0,s=o,void c(e)}}},d=e=>{const t=s??n.find(e=>e.swallowing);t&&(c(e),"click"===e.type&&(t.swallowing=!1,s=null,f()))};function f(){const e=!!s||n.some(e=>!1!==e.active);if(e===t)return;const o=e?"addEventListener":"removeEventListener";document[o]("pointerdown",u,!0),document[o]("mousedown",u,!0),document[o]("pointerup",d,!0),document[o]("mouseup",d,!0),document[o]("click",d,!0),t=e}e.shared.dismiss=e.proxy({__okDismissService:!0,register(e={}){const t={active:!0,swallowing:!1,owner:e.owner??null,surfaces:e.surfaces??e.surface??null,anchors:e.anchors??e.anchor??null,outsideAction:e.outsideAction??"close",enabled:e.enabled??!0,onDismiss:e.onDismiss??null};return n.push(t),f(),{get entry(){return t},update(e={}){Object.assign(t,e)},bringToFront(){const e=n.indexOf(t);-1!==e&&n.splice(e,1),n.push(t)},stop(){t.active=!1;const e=n.indexOf(t);-1!==e&&n.splice(e,1),f()}}},dispose(){n.splice(0),s=null,f()},get stack(){return l(),n.slice()}})}};export{e as default};
@@ -0,0 +1 @@
1
+ var e={tag:"ok-draggable",template:"<slot/>",attr:{handle:{default:"[data-drag-handle]"},noDrag:{empty:!1}},style:"[tag]{display:contents}",context:e=>({isDragging:!1,initialX:0,initialY:0,offsetX:0,offsetY:0,draggableElement:null,onDragStart(t){if(e.$attr.noDrag||0!==t.button)return;if(t.preventDefault(),this.draggableElement=e.$el.firstElementChild,!this.draggableElement)return;this.isDragging=!0,this.initialX=t.clientX,this.initialY=t.clientY;const n=this.draggableElement.getBoundingClientRect();this.offsetX=n.left,this.offsetY=n.top;const a=e.$el.querySelector(e.$attr.handle)||e.$el.firstElementChild;a&&(a.style.cursor="grabbing"),this.draggableElement.style.position="fixed",this.draggableElement.style.margin="0",this.draggableElement.style.boxSizing="border-box",this.draggableElement.style.width=`${n.width}px`,this.draggableElement.style.left=`${this.offsetX}px`,this.draggableElement.style.top=`${this.offsetY}px`,this.draggableElement.style.transform="none",document.addEventListener("mousemove",e.$cache.onDragMove),document.addEventListener("mouseup",e.$cache.onDragEnd)},onDragMove(e){if(!this.isDragging)return;const t=e.clientX-(this.initialX-this.offsetX),n=e.clientY-(this.initialY-this.offsetY);this.draggableElement.style.left=`${t}px`,this.draggableElement.style.top=`${n}px`},onDragEnd(){this.isDragging=!1;const t=e.$el.querySelector(e.$attr.handle)||e.$el.firstElementChild;t&&(t.style.cursor="grab"),document.removeEventListener("mousemove",e.$cache.onDragMove),document.removeEventListener("mouseup",e.$cache.onDragEnd),this.draggableElement=null}}),mounted(e){e.$cache.onDragStart=this.onDragStart.bind(this),e.$cache.onDragMove=this.onDragMove.bind(this),e.$cache.onDragEnd=this.onDragEnd.bind(this);const t=e.$el.querySelector(e.$attr.handle)||e.$el.firstElementChild;t&&(t.style.cursor="grab",t.addEventListener("mousedown",e.$cache.onDragStart))},unmounted(e){const t=e.$el.querySelector(e.$attr.handle)||e.$el.firstElementChild;t&&t.removeEventListener("mousedown",e.$cache.onDragStart),document.removeEventListener("mousemove",e.$cache.onDragMove),document.removeEventListener("mouseup",e.$cache.onDragEnd)}};export{e as default};
@@ -0,0 +1 @@
1
+ import t from"../core/ok-layer-service.ok.js";import e from"./ok-portal-service.ok.js";var r={tag:"ok-flyover-panel",dependencies:[t,e],attr:{anchor:{},placement:{default:"right-start"},gap:{default:0},portal:{default:!0,empty:!0},layer:{default:"flyover"}},context(t){let e=null,r=null,o=null,a=null,n=!1;const l=()=>t.$ok.shared.layer?.resolveLocalZ?.(t.$attr.layer)??2e3,i=()=>{const e=(o=t.$attr.anchor)?o instanceof MouseEvent?{left:o.clientX,right:o.clientX,top:o.clientY,bottom:o.clientY,width:0,height:0}:"x"in o&&"y"in o?{left:o.x,right:o.x,top:o.y,bottom:o.y,width:0,height:0}:o.getBoundingClientRect?o.getBoundingClientRect():null:null,r=t.$el;var o;if(!e||!r)return;const a=r.offsetWidth,n=r.offsetHeight;let i=0,s=0;t.$attr.placement.startsWith("right")?(i=e.right+t.$attr.gap,s=t.$attr.placement.endsWith("start")?e.top:e.bottom-n,i+a>innerWidth&&(i=e.left-t.$attr.gap-a)):(i=e.left,s=e.bottom+t.$attr.gap,s+n>innerHeight&&(s=e.top-t.$attr.gap-n));const d=((t,e,r,o)=>(t+r>innerWidth&&(t=Math.max(4,innerWidth-r-4)),e+o>innerHeight&&(e=Math.max(4,innerHeight-o-4)),{x:t,y:e}))(i,s,a,n);r.style.position="fixed",r.style.left=`${d.x}px`,r.style.top=`${d.y}px`,r.style.zIndex=String(l())},s=()=>{e?.disconnect(),e=null,r&&(window.removeEventListener("scroll",r,!0),window.removeEventListener("resize",r,!0),r=null),o&&(document.removeEventListener("ok-layer-owner-change",o),o=null),a&&(window.removeEventListener("pointermove",a),a=null)},d=async()=>{if(!1===t.$attr.portal)return t.$el.style.pointerEvents="auto",void(n=!1);const e=t.$ok.shared.portal;if(!e)return t.$el.style.pointerEvents="auto",void(n=!1);const r=t.$ok.shared.layer,o=l(),a=r?.ownerOf?.(t.$attr.anchor)?t.$attr.anchor:t.$el,i=r?await r.containerFor(a,t.$attr.layer):document.body;i&&!t.$__unmount__$&&(e.to(t.$el,i),t.$el.style.zIndex=String(o),t.$el.style.pointerEvents="auto",n=!0)},c=()=>{n&&(t.$ok.shared.portal?.back(t.$el),n=!1)};return t.$watch(()=>[t.$attr.anchor,t.$attr.placement,t.$attr.gap],i),t.$watch(()=>t.$attr.portal,async()=>{t.$__unmount__$||(!1===t.$attr.portal?c():(await d(),i()))}),{attachPortal:d,restorePortal:c,attachObservers:()=>{s(),e=new ResizeObserver(()=>i()),e.observe(document.documentElement),r=()=>i(),window.addEventListener("scroll",r,!0),window.addEventListener("resize",r,!0),o=e=>{const r=t.$el?.closest?.("[data-ok-layer-owner]");r&&e.target===r&&requestAnimationFrame(async()=>{await d(),i()})},document.addEventListener("ok-layer-owner-change",o);let n=!1;a=()=>{n||(n=!0,requestAnimationFrame(()=>{n=!1,i()}))},window.addEventListener("pointermove",a)},detachObservers:s,place:i}},mounted(t){t.$el.classList.add("ok-flyover"),t.$el.dispatchEvent(new CustomEvent("ok-flyover-panel-mounted",{bubbles:!0,detail:t.$el})),t.$ok.nextFrame(async()=>{t.$__unmount__$||(await this.attachPortal(),this.place(),this.attachObservers())})},unmounted(t){this.detachObservers(),this.restorePortal()},template:"<slot/>",style:"[tag]{position:fixed;background:var(--ok-flyover-bg, var(--ok_bg, #fff));color:var(--ok-flyover-color, var(--ok_fg, #111));border:var(--ok-flyover-border, 1px solid color-mix(in srgb, #000 10%, transparent));box-shadow:var(--ok-flyover-shadow, 0 6px 30px rgba(0,0,0,.15));border-radius:var(--ok-flyover-radius, 6px);min-width:160px}"};export{r as default};
@@ -0,0 +1 @@
1
+ import e from"../core/ok-layer-service.ok.js";import o from"./ok-dismiss-service.ok.js";import t from"./ok-portal-service.ok.js";import r from"./ok-flyover-panel.ok.js";var a={tag:"ok-flyover",dependencies:[e,t,o,r],attr:{open:{default:!1},anchor:{},placement:{default:"right-start"},gap:{default:0},portal:{default:!0,empty:!0},outsideAction:{default:"pass-through"},layer:{default:"flyover"}},context(e){let o=null,t=null;const r=e=>{t=e.detail};e.$el.addEventListener("ok-flyover-panel-mounted",r);const a=()=>{o?.stop(),o=e.$ok.shared.dismiss?.register({owner:e.$el,surfaces:()=>t,anchors:()=>e.$attr.anchor instanceof MouseEvent?[]:[e.$attr.anchor],outsideAction:()=>e.$attr.outsideAction,enabled:()=>e.$attr.open,onDismiss(o){e.$attr.open=!1;const t={sourceEvent:o,reason:"outside"};e.$dispatch("request-close",t),e.$dispatch("close",t)}})};return e.$watch(()=>e.$attr.open,e=>{e?a():(t=null,o?.stop(),o=null)}),e.$attr.open&&a(),e.$ext("unmount",()=>{e.$el.removeEventListener("ok-flyover-panel-mounted",r),o?.stop(),o=null}),{}},template:'<if :="$props.open"><ok-flyover-panel :anchor="$props.anchor" :placement="$props.placement" :gap="$props.gap" :portal="$props.portal" :layer="$props.layer"><slot/></ok-flyover-panel></if>'};export{a as default};
@@ -0,0 +1 @@
1
+ import i from"../core/ok-layer-service.ok.js";import t from"./ok-highlight.ok.js";var e={tag:"ok-highlight-service",dependencies:[t,i],register(i,t){i.shared.highlight=i.proxy({highlights:[],async show(e,h={}){if(!(e instanceof Element))return;await i.shared.layer.toggle("ok-highlight-service",!0,{registration:t,layer:"highlight"});const s=e.getBoundingClientRect(),g={active:!0,target:e,mask:!!h.mask,persistent:!!h.persistent,duration:h.duration??1e3,speed:h.speed??300,animation:h.animation??"pulse",class:h.class??"default",onClick:h.onClick??null,top:s.top+window.scrollY,left:s.left+window.scrollX,width:s.width,height:s.height,close(){i.shared.highlight.hide(g)}};return this.highlights.push(g),g},async hide(t){if(!t)return;const e=this.highlights.indexOf(i.proxy(t));e>=0&&this.highlights.splice(e,1),this.highlights.length||await i.shared.layer.toggle("ok-highlight-service",!1)}})},context:i=>({highlights:i.$ok.shared.highlight.highlights}),template:'<each :="highlights" let:item><ok-highlight :options="item"/></each>',style:"[tag]{position:fixed;inset:0;z-index:var(--ok-z-highlight, 3500);pointer-events:none}"};export{e as default};
@@ -0,0 +1 @@
1
+ var t={tag:"ok-highlight",attr:{options:{type:"any"}},context:t=>({get opts(){return t.$attr.options||{}},close(){t.opts?.onClick?.(),t.$ok.shared.highlight.hide(t.opts)},reset(){const e=t.$el,i=this.opts,{top:s,left:o,width:a,height:n,speed:p=300}=i;if(Object.assign(e.style,{left:"0px",top:"0px",width:window.innerWidth+"px",height:window.innerHeight+"px",transformOrigin:"center center",transition:`all ${p}ms ease`}),requestAnimationFrame(()=>{Object.assign(e.style,{left:`${o}px`,top:`${s}px`,width:`${a}px`,height:`${n}px`}),e.classList.add("shrink-in")}),i.persistent||setTimeout(()=>{e.classList.add("fade-out"),e.addEventListener("transitionend",()=>t.$destroy(),{once:!0})},i.duration??1e3),i.mask){const i=o+a,p=s+n,h=document.createElement("div");h.className="ok-highlight__mask",h.style.clipPath=`polygon(\n 0 0, 100vw 0, 100vw 100vh, 0 100vh,\n 0 ${s}px, ${o}px ${s}px, ${o}px ${p}px,\n ${i}px ${p}px, ${i}px ${s}px, 0 ${s}px\n )`,h.style.webkitClipPath=h.style.clipPath,h.addEventListener("click",t=>t.stopPropagation()),(t.$el.parentNode||document.body).appendChild(h),e._mask=h}}}),mounted(t){this.reset(),t.$el.addEventListener("click",this.close)},unmounted(t){t.$el._mask?.remove(),this.opts.close()},template:'<div class="ok-highlight" :class="[opts.class, opts.animation]"/>',style:"@keyframes ok-highlight-pulse{0%{box-shadow:0 0 0#0f0;opacity:.2}50%{box-shadow:0 0 10px #0f0;opacity:1}to{box-shadow:0 0 4px #0f0;opacity:.7}}.ok-highlight__mask,[tag]{position:fixed;pointer-events:auto}[tag]{border:2px solid var(--ok_fg-accent, #0f0);border-radius:6px;box-shadow:0 0 10px var(--ok_fg-accent, #0f0);z-index:1;transition:all 300ms ease}[tag].shrink-in{transition:all 500ms ease}[tag].fade-out{opacity:0;transition:opacity 300ms ease}.ok-highlight.pulse{animation:ok-highlight-pulse 1s ease-out}.ok-highlight__mask{inset:0;background:rgba(0,0,0,.6);z-index:0;clip-rule:evenodd;-webkit-clip-path:inherit;clip-path:inherit}",plugins:{theme:{let:{"--ok_fg-accent":"#0f0"}}}};export{t as default};
@@ -0,0 +1 @@
1
+ import e from"../modals/ok-window.ok.js";var o={tag:"ok-hotkeys-service",dependencies:[e],context:e=>({get registrations(){return e.$ok.shared.hotkeys.registrations}}),register(e,o){e.shared.hotkeys=e.proxy({registrations:[],activeCombos:new Set,downKeys:new Set,_normalize(e){const o=[];e.ctrlKey&&o.push("ctrl"),e.altKey&&o.push("alt"),e.shiftKey&&o.push("shift"),e.metaKey&&o.push("meta");const t=e.key.toLowerCase();return["control","alt","shift","meta"].includes(t)||o.push(t),o},_match:(e,o)=>e.length===o.size&&e.every(e=>o.has(e)),_handleDown(e){this._normalize(e).forEach(e=>this.downKeys.add(e));for(const o of this.registrations){if(!o.enabled)continue;const t=Array.isArray(o.keyCombo)?o.keyCombo:[o.keyCombo];new Set(t.map(e=>e.toLowerCase()));const s=t.join("+");if(this._match(t.map(e=>e.toLowerCase()),this.downKeys)){if(this.activeCombos.has(s))continue;this.activeCombos.add(s),!1!==o.preventDefault&&e.preventDefault(),!0===o.stopPropagation&&e.stopPropagation(),o.keydown?.(e)}}},_handleUp(e){const o=e.key.toLowerCase();this.downKeys.delete(o);for(const o of this.registrations){const t=Array.isArray(o.keyCombo)?o.keyCombo:[o.keyCombo],s=t.join("+");this.activeCombos.has(s)&&(t.map(e=>e.toLowerCase()).every(e=>this.downKeys.has(e))||(this.activeCombos.delete(s),o.keyup?.(e)))}},register(o,t={}){const s={keyCombo:Array.isArray(o)?o:[o],keydown:t.keydown,keyup:t.keyup,description:t.description||"",enabled:!1!==t.enabled,preventDefault:!1!==t.preventDefault,stopPropagation:!0===t.stopPropagation};return this.registrations.push(s),1===this.registrations.length&&(e.config.window.addEventListener("keydown",this._handleDown.bind(this)),e.config.window.addEventListener("keyup",this._handleUp.bind(this))),s},unregister(o){const t=this.registrations.indexOf(o);-1!==t&&this.registrations.splice(t,1),this.registrations.length||(e.config.window.removeEventListener("keydown",this._handleDown),e.config.window.removeEventListener("keyup",this._handleUp),this.downKeys.clear(),this.activeCombos.clear())},async toggle(t=null){await e.shared.layer.toggle("ok-hotkeys-service",t,{registration:o,tier:"window"})}}),"dev"===e.config.env&&e.shared.hotkeys.register(["ctrl","alt","f10"],{description:"Toggle hotkeys window",keydown(){e.shared.hotkeys.toggle()}})},template:'<ok-window no-portal title="Hotkeys" @close="$ok.shared.hotkeys.toggle(false)"><div class="ok-hotkeys-service__list"><each :="registrations" let:item><div class="ok-hotkeys-service__item"><code class="ok-hotkeys-service__combo"><each :="Array.isArray(item.keyCombo) ? item.keyCombo : [item.keyCombo]" let:item let:index let:items><span class="ok-hotkeys-service__key">{{ item }}</span><if :="items.length - 1 === index"><span class="ok-hotkeys-service__sep">+</span></if></each></code> <span class="ok-hotkeys-service__desc">{{ item.description }}</span></div></each></div></ok-window>',style:"[tag]{display:contents}.ok-hotkeys-service__list{padding:1em;font-family:monospace}.ok-hotkeys-service__item{display:flex;align-items:center;margin-bottom:.5em}.ok-hotkeys-service__combo{margin-right:1em;color:#ccc}.ok-hotkeys-service__key{background:#333;color:#fff;padding:2px 6px;border-radius:3px;margin:0 2px}.ok-hotkeys-service__sep{color:#888}.ok-hotkeys-service__desc{flex:1}"};export{o as default};
@@ -0,0 +1 @@
1
+ import e from"../core/ok-layer-service.ok.js";var t={tag:"ok-picker-service",dependencies:[e],register(e,t){e.shared.picker=e.proxy({picking:!1,hoverElement:null,selectedElement:null,labelElement:null,labelContainer:null,config:null,onHover(t){t!==this.hoverElement&&(this.clearHover(),this.hoverElement=t,this.config?.hoverClass&&t.classList.add(this.config.hoverClass),this.config?.showLabel&&(this.labelElement||(this.labelElement=document.createElement("div"),this.labelElement.className="ok-picker__label",this.labelElement.style.zIndex=String(e.shared.layer?.resolveLayerZ("tooltip")??5e3),(this.labelContainer||document.body).appendChild(this.labelElement)),this.labelElement.textContent=this.config.labelTemplate(t),this.labelElement.style.display="block"))},onSelect(e){this.clearSelect(),this.selectedElement=e,this.config?.selectedClass&&e.classList.add(this.config.selectedClass),this.config?.onPick&&this.config.onPick(e),this.stop()},clearHover(){this.hoverElement&&this.config?.hoverClass&&this.hoverElement.classList.remove(this.config.hoverClass),this.hoverElement=null,this.labelElement&&(this.labelElement.style.display="none")},clearSelect(){this.selectedElement&&this.config?.selectedClass&&this.selectedElement.classList.remove(this.config.selectedClass),this.selectedElement=null},async start(i={}){this.picking&&await this.stop();const l=await e.shared.layer.toggle("ok-picker-service",!0,{registration:t});this.labelContainer=l?.parentNode||e.shared.layer.container||document.body,this.config={hoverClass:"ok-picker__hover",selectedClass:"ok-picker__selected",filter:()=>!0,onPick:()=>{throw new Error("onPick not defined")},cancelOnEsc:!0,root:e.config.body||document,showLabel:!0,labelTemplate:e=>e.tagName.toLowerCase()+(e.id?`#${e.id}`:""),labelOffset:{x:10,y:10},...i},this.picking=!0,this.config.root.addEventListener("pointermove",this._onPointerMove),this.config.root.addEventListener("click",this._onClick,!0),this.config.root.addEventListener("keydown",this._onKeyDown)},async stop(){this.picking&&(this.clearHover(),this.clearSelect(),this.labelElement&&(this.labelElement.remove(),this.labelElement=null),this.config.root.removeEventListener("pointermove",this._onPointerMove),this.config.root.removeEventListener("click",this._onClick,!0),this.config.root.removeEventListener("keydown",this._onKeyDown),this.picking=!1,this.labelContainer=null,this.config=null,await e.shared.layer.toggle("ok-picker-service",!1))},_onPointerMove(t){const i=t.target.closest("*");if(i&&e.shared.picker.config?.filter(i)&&(e.shared.picker.onHover(i),e.shared.picker.labelElement)){const{x:i,y:l}=e.shared.picker.config.labelOffset;e.shared.picker.labelElement.style.left=`${t.clientX+i}px`,e.shared.picker.labelElement.style.top=`${t.clientY+l}px`}},_onClick(t){const i=t.target.closest("*");i&&e.shared.picker.config?.filter(i)&&(t.preventDefault(),t.stopPropagation(),e.shared.picker.onSelect(i))},_onKeyDown(t){"Escape"===t.key&&e.shared.picker.config?.cancelOnEsc&&e.shared.picker.stop()}})},style:".ok-picker__hover{outline:2px dotted #0f0;outline-offset:-2px;cursor:crosshair!important}.ok-picker__selected{outline:2px solid #0f0;outline-offset:-2px}.ok-picker__label{position:fixed;background:rgba(0,255,0,.9);color:#000;padding:4px 8px;border-radius:3px;font-size:12px;font-family:monospace;pointer-events:none;z-index:5000;white-space:nowrap;display:none}"};export{t as default};
@@ -0,0 +1 @@
1
+ import n from"../sync/reactive-sync-service.ok.js";var t={tag:"ok-popout-service",dependencies:[n],register(n){function t(n,e=null){if(null===n)return"null";if("string"==typeof n)return JSON.stringify(n);if("number"==typeof n||"boolean"==typeof n)return String(n);if("function"==typeof n){const t=n.toString().trim();if(e&&/^[a-zA-Z_$][\w$]*$/.test(e)){const n=/^function\s*\w*\s*\(([^)]*)\)\s*\{/.exec(t);if(n)return`${e}(${n[1]})${t.slice(t.indexOf("{"))}`}return t}if(n instanceof HTMLTemplateElement)return JSON.stringify(n.content.innerHTML);if(n instanceof HTMLStyleElement)return JSON.stringify(n.innerHTML);if(Array.isArray(n))return`[${n.map(n=>t(n)).join(", ")}]`;if("object"==typeof n)return`{${Object.entries(n).map(([n,e])=>{const o=/^[a-zA-Z_$][\w$]*$/.test(n);return o&&"function"==typeof e?t(e,n):`${o?n:JSON.stringify(n)}: ${t(e)}`}).join(", ")}}`;throw new Error("Cannot serialize value: "+n)}n.shared.popout={async pop(e,{context:o,deps:r=[],title:i="Popout",width:s=600,height:c=800}={}){const a=function(){const t=[];return n.componentRegistry.cache.keys().forEach(e=>{const o=n.componentRegistry.cache.get(e);o.raw?._primitive||"import"===o.type&&(o.parent||t.push({config:o.config,options:{base:o.base||document.baseURI||window.location.href}}))}),t}(),p=(y=o)&&"object"==typeof y&&y[n.OK.OKProxy.SYM_OKPROXY_INSTANCE];var y;const f="ok-sync-"+Math.random().toString(36).slice(2);let u="";u=void 0===o?"\n await ok.init(document.body);\n ":p?`\n const ctx = ok.proxy({});\n const sync = ok.shared.sync.createReactiveSync(\n ctx,\n { transport: ok.shared.sync.createBroadcastTransport("${f}") }\n );\n await sync.fetch();\n await ok.init(document.body, ctx);\n `:`\n const ctx = ok.proxy(${t(o)});\n await ok.init(document.body, ctx);\n `;const l=`<!DOCTYPE html>\n<html>\n<head>\n <title>${i}</title>\n <style> body { margin: 0; font-family: sans-serif; } </style>\n</head>\n<body>\n${n.createNodes(e).map(n=>n.outerHTML).join("\n")}\n\n<script type="module">\n import OK from "${n.OK.url}";\n const ok = OK();\n\n ${a.map(n=>`ok.register(${t(n.config)}, ${t(n.options)});`).join("\n")}\n ${r.map(n=>`ok.register(${t(n)}, null, { override: true });`).join("\n")}\n\n (async () => {\n await ok.componentRegistry.initPendingRegistrations();\n ${u}\n })();\n<\/script>\n</body>\n</html>`,d=new Blob([l],{type:"text/html"}),m=URL.createObjectURL(d),$=window.open(m,"",`width=${s},height=${c}`);if($)return p&&n.shared.sync.createReactiveSync(n.proxy(o),{transport:n.shared.sync.createBroadcastTransport(f)}),{stop(){$.close()}};alert("Popup blocked")}}}};export{t as default};
@@ -0,0 +1 @@
1
+ import o from"./ok-popout-service.ok.js";var t={tag:"ok-popout",dependencies:[o],attr:{noConfirm:{default:!1,empty:!0},confirmText:{default:"Confirm popout"},noRemove:{default:!1,empty:!0}},context:o=>({show:!1,async pop(){const t=await o.$ok.shared.popout.pop(o,o.$cache.cmp.templates.default,o.$context);o.$once("unmount",()=>t.stop()),o.$listen(window,"close",()=>{t.stop()})}}),mount(o){o.$el.pop=this.pop,o.$attr.noConfirm?this.pop():o.$ok.shared.modal.confirm(o.$attr.confirmText).then(o=>{o&&this.pop()}),o.$attr.noRemove?this.show=!0:o.$destroy()},template:'<if :="show"><slot/></if>'};export{t as default};
@@ -0,0 +1 @@
1
+ var e={tag:"ok-portal-service",register(e){const n=new WeakMap,o=new WeakMap,r=e=>e instanceof Node?e:null,t=(o,t)=>{const s=r(o),a=r(t);if(!s||!a)return!1;const c=(o=>{let r=n.get(o);if(r)return r;const t=o.parentNode;if(!t)return null;const s=o.$owner,a=s?.$handle,c=a?a.nodes.indexOf(o):-1;if(a&&-1!==c){const n=e.config.document.createTextNode("");n.$owner=s,n.$scope={$__init__$:!0,$__unmount__$:null,$destroy(){if(n.$scope=null,o.parentNode&&o.remove(),!a.isDestroyed){const e=a.nodes.indexOf(n);-1!==e&&a.splice(e,1)}return Promise.resolve()}},t.insertBefore(n,o),a.nodes[c]=n,o.$owner=null,r={node:o,stub:n,handle:a,handleIdx:c,owner:s}}else{const n=e.config.document.createComment("ok-portal-anchor");t.insertBefore(n,o),r={node:o,anchor:n}}return n.set(o,r),r})(s);return!!c&&(s.parentNode!==a&&a.appendChild(s),!0)},s=e=>{const t=r(e);if(!t)return!1;const s=n.get(t);if(!s)return!1;if(s.stub){const{stub:e,handle:n,handleIdx:o,owner:r}=s;if(e.parentNode){if(e.$scope=null,e.parentNode.insertBefore(t,e),e.remove(),n&&!n.isDestroyed){const r=n.nodes.indexOf(e),s=-1!==r?r:o;n.nodes[s]=t}t.$owner=r}else t.parentNode&&t.remove();e.$owner=null}else s.anchor&&(s.anchor?.parentNode?(s.anchor.parentNode.insertBefore(t,s.anchor),s.anchor.remove()):(s.anchor?.remove(),t.parentNode&&t.remove()));return n.delete(t),o.delete(t),!0};e.shared.portal=e.proxy({create:a=>{const c=r(a);if(!c)return null;const d=o.get(c);if(d)return d;const l=e.proxy({to:e=>t(c,e),back:()=>s(c),get active(){return!!n.get(c)}});return o.set(c,l),l},to:t,back:s,has(e){const o=r(e);return!(!o||!n.get(o))}})},template:"",style:"[tag]{display:none}"};export{e as default};
@@ -0,0 +1 @@
1
+ var e={tag:"ok-submenu",attr:{placement:{default:"right-start"},openOn:{default:"hover"},openDelay:{default:120},closeDelay:{default:200}},context(e){let t=null;const n=(e,n)=>{clearTimeout(t),t=setTimeout(n,e)};return{isOpen:!1,trigger:null,onEnter(){clearTimeout(t),n(e.$attr.openDelay,()=>this.isOpen=!0)},onLeave(){clearTimeout(t),n(e.$attr.closeDelay,()=>this.isOpen=!1)},onTriggerClick(t){"click"===e.$attr.openOn&&(t.stopPropagation(),setOpen(!open))},onTriggerKey(e){"ArrowRight"===e.key&&(this.isOpen=!0,e.preventDefault()),"ArrowLeft"===e.key&&(this.isOpen=!1,e.preventDefault()),"Escape"===e.key&&(this.isOpen=!1)}}},template:'<div class="ok-submenu" role="none" @mouseenter="onEnter" @mouseleave="onLeave"><div class="ok-submenu__trigger" @mount="trigger = $el" @click="onTriggerClick" @keydown="onTriggerKey"><slot/></div><ok-flyover :open="isOpen" :anchor="trigger" :placement="$props.placement"><div class="ok-submenu__panel" role="menu" @mouseenter="onEnter" @mouseleave="onLeave"><slot name="content"/></div></ok-flyover></div>',style:".ok-submenu__trigger{display:flex}"};export{e as default};
@@ -0,0 +1 @@
1
+ var e={tag:"ok-resizer",attr:{target:{default:null},direction:{default:"horizontal"}},context(e){let t=!1;function r(r){r.preventDefault(),t=!0;const i=e.$attr.direction||"horizontal",o=e.$attr.target?e.$el.parentNode.querySelector(e.$attr.target):e.$el.previousElementSibling;if(!o)return;const n=r.clientX,a=r.clientY,s=o.offsetWidth,d=o.offsetHeight,l=e=>{if(t)if("horizontal"===i){const t=e.clientX-n;o.style.width=`${s+t}px`}else{const t=e.clientY-a;o.style.height=`${d+t}px`}},c=()=>{t=!1,window.removeEventListener("mousemove",l),window.removeEventListener("mouseup",c)};window.addEventListener("mousemove",l),window.addEventListener("mouseup",c)}return e.$listen(e.$el,"mousedown",r),{startResize:r}},template:'<div class="grabber"/>',style:"[tag]{display:flex;flex-shrink:0;background:0 0;position:relative;justify-content:center;align-items:center}[tag][direction=horizontal]{cursor:ew-resize}[tag][direction=vertical]{cursor:ns-resize}[tag][direction=horizontal] .grabber{margin:1px;width:2px;height:32px;border-left:2px dotted rgba(0,0,0,.5);border-right:2px dotted rgba(0,0,0,.5)}[tag][direction=vertical] .grabber{height:2px;width:32px;cursor:ns-resize;border-top:2px dotted rgba(0,0,0,.3);border-bottom:2px dotted rgba(0,0,0,.3)}"};export{e as default};
@@ -0,0 +1 @@
1
+ const e=import.meta.url;var o=[{tag:"async",path:"./behavior/async.ok.js",meta:["ui"]},{tag:"ok-theme",path:"./theming/ok-theme.ok.js",meta:["ui"]},{tag:"transition",path:"./core/transition.ok.js",meta:["ui"]},{tag:"virtualized",path:"./core/virtualized.ok.js",meta:["ui","heavy"]},{tag:"ok-overlay",path:"./core/ok-overlay.ok.js",meta:["ui"]},{tag:"ok-layer",path:"./core/ok-layer.ok.js",meta:["ui"]},{tag:"ok-layer-service",path:"./core/ok-layer-service.ok.js",meta:["service"]},{tag:"router",path:"./navigation/router.ok.js",meta:["ui"]},{tag:"hash-router",path:"./navigation/hash-router.ok.js",meta:["ui"]},{tag:"history-router",path:"./navigation/history-router.ok.js",meta:["ui"]},{tag:"ok-icon",path:"./elements/ok-icon.ok.js",meta:["ui","cdn"]},{tag:"ok-table",path:"./elements/ok-table.ok.js",meta:["ui","heavy"]},{tag:"ok-dropdown",path:"./elements/ok-dropdown.ok.js",meta:["ui"]},{tag:"ok-select",path:"./elements/ok-select.ok.js",meta:["ui"]},{tag:"ok-window",path:"./modals/ok-window.ok.js",meta:["ui"]},{tag:"ok-modal",path:"./modals/ok-modal.ok.js",meta:["ui"]},{tag:"ok-modal-service",path:"./modals/ok-modal-service.ok.js",meta:["service"]},{tag:"ok-toast-service",path:"./modals/ok-toast-service.ok.js",meta:["service"]},{tag:"ok-contextmenu",path:"./interaction/ok-contextmenu.ok.js",meta:["ui"]},{tag:"ok-popout",path:"./interaction/ok-popout.ok.js",meta:["ui"]},{tag:"ok-popout-service",path:"./interaction/ok-popout-service.ok.js",meta:["service"]},{tag:"ok-picker-service",path:"./interaction/ok-picker-service.ok.js",meta:["service"]},{tag:"ok-submenu",path:"./interaction/ok-submenu.ok.js",meta:["ui"]},{tag:"ok-highlight",path:"./interaction/ok-highlight.ok.js",meta:["ui"]},{tag:"ok-highlight-service",path:"./interaction/ok-highlight-service.ok.js",meta:["ui","service"]},{tag:"ok-draggable",path:"./interaction/ok-draggable.ok.js",meta:["ui"]},{tag:"ok-flyover",path:"./interaction/ok-flyover.ok.js",meta:["ui"]},{tag:"ok-flyover-panel",path:"./interaction/ok-flyover-panel.ok.js",meta:["ui"]},{tag:"ok-hotkeys-service",path:"./interaction/ok-hotkeys-service.ok.js",meta:["service"]},{tag:"ok-dismiss-service",path:"./interaction/ok-dismiss-service.ok.js",meta:["service"]},{tag:"ok-portal-service",path:"./interaction/ok-portal-service.ok.js",meta:["service"]},{tag:"ok-chart",path:"./components/ok-chart.ok.js",meta:["ui","heavy"]},{tag:"ok-marked",path:"./components/ok-marked.ok.js",meta:["ui","cdn"]},{tag:"ok-doc-viewer",path:"./components/ok-doc-viewer.ok.js",meta:["ui","cdn"]},{tag:"ok-monaco",path:"./components/ok-monaco.ok.js",meta:["dev","editor","heavy","cdn"]},{tag:"ok-resizer",path:"./layout/ok-resizer.ok.js",meta:["ui"]},{tag:"reactive-sync-service",path:"./sync/reactive-sync-service.ok.js",meta:["service"]},{tag:"ok-console",path:"./devtools/ok-console.ok.js",meta:["dev","debug"]},{tag:"ok-console-service",path:"./devtools/ok-console-service.ok.js",meta:["dev","debug","service"]},{tag:"ok-fps-monitor",path:"./devtools/ok-fps-monitor.ok.js",meta:["dev","debug"]},{tag:"ok-fps-monitor-service",path:"./devtools/ok-fps-monitor-service.ok.js",meta:["dev","debug","service"]},{tag:"ok-inspector",path:"./devtools/ok-inspector.ok.js",meta:["dev","heavy","debug"]},{tag:"ok-inspector-service",path:"./devtools/ok-inspector-service.ok.js",meta:["dev","debug","service"]},{tag:"ok-js-tree",path:"./devtools/ok-js-tree.ok.js",meta:["dev","editor"]},{tag:"ok-live-shell",path:"./editor/ok-live-shell.ok.js",meta:["dev","editor","heavy"]},{tag:"ok-live-component",path:"./editor/ok-live-component.ok.js",meta:["dev","editor","heavy"]},{tag:"ok-live-example",path:"./editor/ok-live-example.ok.js",meta:["dev","editor","heavy"]},{tag:"ok-theme-editor",path:"./theming/ok-theme-editor/ok-theme-editor.ok.js",meta:["dev","editor","heavy"]},{tag:"ok-theme-editor-service",path:"./theming/ok-theme-editor/ok-theme-editor-service.ok.js",meta:["dev","editor","service"]},{tag:"i18n-service",path:"./i18n/i18n-service.ok.js",meta:["service"]},{tag:"i18n-editor",path:"./i18n/i18n-editor.ok.js",meta:["dev","editor"]},{tag:"ok-crash-info",path:"./errors/ok-crash-info.ok.js",meta:["dev","debug","service"]},{tag:"ok-sandbox",path:"./core/ok-sandbox.ok.js",meta:["ui","security"]},{tag:"ok-timeline",path:"./devtools/ok-timeline.ok.js",meta:["dev","performance"]},{tag:"ok-timeline-service",path:"./devtools/ok-timeline-service.ok.js",meta:["service","dev","performance"]}];export{e as base,o as default};
@@ -0,0 +1 @@
1
+ import e from"../core/ok-layer.ok.js";import t from"../core/ok-layer-service.ok.js";import n from"../core/ok-overlay.ok.js";import o from"../interaction/ok-draggable.ok.js";import a from"./ok-modal.ok.js";let r=0;var l={tag:"ok-modal-service",dependencies:[t,e,n,o,a],template:'<if :="stack.length"><each :="stack" let:item="m"><ok-layer no-portal type="modal" tier="modal" :order="stack.indexOf(m)"><ok-overlay @request-close="onBackdropClick"><ok-draggable :no-drag="!m.canDrag" handle=".ok-modal__header"><ok-modal no-portal :no-close="!m.hasClose" :no-footer="m.footer == null" @close="onBackdropClick" :data-modal-id="m.id" aria-modal="true"><template name="title"><fragment :nodes="$ok.createNodes(m.title)" :context="m.context" :scope="m.scopeOverride"/></template><fragment :nodes="$ok.createNodes(m.content)" :context="m.context" :scope="m.scopeOverride"/><template name="footer"><fragment :nodes="$ok.createNodes(m.footer)" :context="m.context" :scope="m.scopeOverride"/></template></ok-modal></ok-draggable></ok-overlay></ok-layer></each></if>',register(e,t){e.shared.modal=e.proxy({stack:[],async open({content:n="",title:o="",footer:a,hasClose:l=!0,canClose:i=!0,canDrag:c=!0,onClosed:s=null,onOpened:d=null,owner:m=null,context:u=e=>({})}={}){const p=this,h=function(){let e,t,n=!1;return{promise:new Promise((o,a)=>{e=e=>{n||(n=!0,o(e))},t=e=>{n||(n=!0,a(e))}}),resolve:e,reject:t,get settled(){return n}}}(),f=e.proxy({id:++r,isOpen:!1,content:n,title:o,footer:a,hasClose:l,canClose:i,canDrag:c});let g=null;const k=e.proxy({get id(){return f.id},get isOpen(){return f.isOpen},get context(){return g},get content(){return f.content},set content(e){f.content=e},get title(){return f.title},set title(e){f.title=e},get footer(){return f.footer},set footer(e){f.footer=e},get hasClose(){return f.hasClose},set hasClose(e){f.hasClose=e},get canClose(){return f.canClose},set canClose(e){f.canClose=e},get canDrag(){return f.canDrag},set canDrag(e){f.canDrag=e},get scopeOverride(){return m?e=>({...e,$owner:m}):null},async open(){if(f.isOpen)return;await e.shared.layer.toggle("ok-modal-service",!0,{registration:t,layer:"modal"});const n=p.stack.indexOf(k);-1!==n&&p.stack.splice(n,1),p.stack.push(k),f.isOpen=!0,p._syncLocks(),await(d?.(this))},async close(){if(!f.isOpen||!f.canClose)return;const t=p.stack.indexOf(k);-1!==t&&p.stack.splice(t,1),f.isOpen=!1,p._syncLocks(),requestAnimationFrame(()=>e.shared.layer?.pruneEmpty?.()),p.stack.length||(await e.shared.layer.toggle("ok-modal-service",!1),requestAnimationFrame(()=>e.shared.layer?.pruneEmpty?.())),h.resolve(k),await(s?.(this))},toggle(e=null){(null===e?!this.isOpen:e)?this.open():this.close()},update(e={}){Object.assign(f,e)},bringToFront(){const e=p.stack.indexOf(k);-1!==e&&(p.stack.splice(e,1),p.stack.push(k))},get closed(){return h.promise},get opts(){return f}});return g=e.proxy(u(k)),await k.open(),k},async dialog(e={}){return e={confirmText:"OK",cancelText:"Cancel",hasConfirm:!0,canConfirm:!0,hasCancel:!0,canCancel:!0,data:e=>({}),...e},new Promise(async t=>{await this.open({context:n=>({confirmed:null,get modal(){return n},confirmText:e.confirmText,cancelText:e.cancelText,hasConfirm:e.hasConfirm,hasCancel:e.hasCancel,canConfirm:e.canConfirm,canCancel:e.canCancel,data:e.data(n),async confirm(){this.canConfirm&&(this.confirmed=!0,t(this),await n.close())},async cancel(){this.canCancel&&(this.confirmed=!1,t(this),await n.close())}}),footer:'<if :="hasConfirm"><button :disabled="!canConfirm" @click="confirm">{{ confirmText }}</button></if>\n <if :="hasCancel"><button :disabled="!canCancel" @click="cancel">{{ cancelText }}</button></if>',...e,onClosed(n){null===n.context.confirmed&&t(n.context),e.onClosed?.(n)},onOpened(t){t.context.result=null,e.onOpened?.(t)}})})},async confirm(e,t={}){return(await this.dialog({content:e,...t})).confirmed},async alert(e,t={}){return(await this.dialog({content:e,hasCancel:!1,hasClose:!0,...t})).confirmed},async prompt(e,t={}){const n={type:"text",title:"",value:"",label:"",placeholder:"",help:"",required:!1,min:void 0,max:void 0,step:void 0,minLength:void 0,maxLength:void 0,pattern:void 0,inputMode:void 0,autocomplete:void 0,spellcheck:!0,rows:4,autosize:!1,choices:null,coerce:"auto",sanitize:e=>e,validate:null,validateOn:"submit",confirmText:"OK",cancelText:"Cancel",hasCancel:!0,canCancel:!0,canConfirm:!0,hasConfirm:!0,returnRaw:!1,...t};const o=await this.dialog({...n,data:t=>({type:n.type,modal:t,message:e,value:void 0,choices:n.choices,label:n.label,placeholder:n.placeholder,rows:n.rows,autocomplete:n.autocomplete,inputmode:n.inputMode,spellcheck:n.spellcheck,isValidating:!1,error:"",async setValue(e){this.value=n.sanitize(e),t.context.canConfirm=!1,this.isValidating=!0,this.error=await async function(e){const t=function(e){if(n.required&&(""===e||null==e))return"Required";if("number"===n.type||"integer"===n.type){if(""!==e&&Number.isNaN(Number(e)))return"Not a number";const t=Number(e);if(null!=n.min&&t<n.min)return`Min ${n.min}`;if(null!=n.max&&t>n.max)return`Max ${n.max}`;if(n.step){const o=(t-(n.min??0))/n.step;if(""!==e&&Math.abs(o-Math.round(o))>1e-9)return`Step ${n.step}`}}return n.minLength&&String(e).length<n.minLength?`Min length ${n.minLength}`:n.maxLength&&String(e).length>n.maxLength?`Max length ${n.maxLength}`:!(n.pattern&&!new RegExp(n.pattern).test(String(e)))||"Invalid format"}(e);if(!0!==t)return t;if(n.validate){const t=await n.validate(e);if(!0!==t)return t||"Invalid"}return""}(this.value),this.isValidating=!1,this.error||(t.context.canConfirm=!0)}}),onOpened(e){e.context.data.setValue(n.value??"")},content:'<context :="data">\n <if :="isValidating">Validaing...</if>\n <p><fragment :nodes="$ok.createNodes(message)" /></p>\n <if :="type === \'text\' || type === \'email\' || type === \'password\' || type === \'number\' || type === \'date\' || type === \'time\' || type === \'datetime-local\'">\n <input :type :placeholder :value="value" @keypress:key.enter="modal.context.confirm()" :autocomplete :inputmode :spellcheck @ready="$el.focus()" @input="setValue($el.value)" />\n </if>\n <if :="type === \'textarea\'">\n <textarea :placeholder :value="value" :rows :autocomplete :spellcheck @ready="$el.focus()" @input="setValue($el.value)" />\n </if>\n <if :="type === \'select\'">\n <select @ready="$el.focus()" :value="value" @input="setValue($el.value)">\n <each :="choices" let:item>\n <option :value="item.value">{{ item.label }}</option>\n </each>\n </select>\n </if>\n <if :="type === \'checkbox\'">\n <label><input type="checkbox" :checked="!!value" @input="setValue($el.checked)" /> {{ label }}</label>\n </if>\n <if :="error"><div class="error">{{ error }}</div></if>\n </context>'});return o.confirmed?o.data.value:void 0},_locks:0,_syncLocks(){const e=this.stack.length>0;e&&!this._locks&&(document.documentElement.style.overflow="hidden"),!e&&this._locks&&(document.documentElement.style.overflow=""),this._locks=e?1:0}})},context:e=>({get stack(){return e.$ok.shared.modal.stack},get active(){return this.stack.at(-1)},onBackdropClick(e){const t=this.stack.at(-1);t?.opts?.noClose||t.close()}}),style:"[tag]{position:fixed;inset:0;z-index:var(--ok-z-modal,3000);pointer-events:auto;--ok-overlay_bg:var(--ok-modal-service_overlay-bg)}",plugins:{theme:{expose:{"--ok-modal-service_overlay-bg":{default:"var(--ok-overlay_bg)",type:"color",category:"Colors"}}}}};export{l as default};
@@ -0,0 +1 @@
1
+ import o from"../core/ok-layer-service.ok.js";import e from"../interaction/ok-portal-service.ok.js";var a={tag:"ok-modal",dependencies:[o,e],attr:{noClose:{empty:!0},noFooter:{empty:null},title:{default:null},noPortal:{empty:!0},layer:{default:"modal"}},context:o=>({close(){o.$el.dispatchEvent(new CustomEvent("close",{bubbles:!0}))}}),mount(o){o.$el.setAttribute("tabindex","-1"),o.$el.focus()},mounted(o){o.$attr.noPortal||requestAnimationFrame(async()=>{if(o.$__unmount__$||o.$attr.noPortal)return;const e=o.$ok.shared.layer,a=o.$ok.shared.portal;if(!e||!a)return;const r=await e.containerFor(o.$el,o.$attr.layer);!r||o.$__unmount__$||o.$attr.noPortal||(a.to(o.$el,r),o.$el.style.zIndex=String(e.resolveLocalZ?.(o.$attr.layer)??0),o.$el.style.pointerEvents="auto",o.$cache.modalPortalActive=!0)})},unmounted(o){o.$cache.modalPortalActive&&(o.$ok.shared.portal?.back(o.$el),o.$cache.modalPortalActive=!1)},template:'<div class="ok-modal__header"><div class="ok-modal__title"><slot name="title">{{$props.title || \'\' }}</slot></div><if :="!$props.noClose"><button class="ok-modal__close" @click="close" @mousedown="()=>{}">×</button></if></div><div class="ok-modal__body"><slot/><if :="$slots.footer"/></div><if :="!$props.noFooter"><div class="ok-modal__footer"><slot name="footer"/></div></if>',style:"[tag]{position:fixed;z-index:var(--ok-z-modal, 1001);display:flex;flex-direction:column;top:50%;left:50%;transform:translate(-50%,-50%);background:var(--ok-bg, white);color:var(--ok_fg, black);border-radius:var(--ok-modal-radius, 0.5rem);border-color:var(--ok-modal-border-color, #eee);border-width:var(--ok-modal-border-width, 1px);border-style:solid;box-shadow:var(--ok-modal-shadow, 0 0 1rem rgba(0,0,0,0.2));max-height:90vh;overflow:hidden}[tag] .ok-modal__body{overflow-y:auto;padding:var(--ok-modal-padding, 1rem);max-height:100%}[tag] .ok-modal__footer,[tag] .ok-modal__header{display:flex;justify-content:space-between;align-items:center;padding:var(--ok-modal-header-padding, 0.5rem 1rem);border-color:var(--ok-modal-header-border-color, var(--ok-modal-border-color, #eee));border-style:solid}[tag] .ok-modal__header{border-width:0 0 var(--ok-modal-header-border-width, 1px)0}[tag] .ok-modal__footer{border-width:var(--ok-modal-header-border-width, 1px)0 0 0}[tag] .ok-modal__title{font-weight:700;flex-grow:1}[tag] .ok-modal__close{background:0 0;border:0;font-size:1.5rem;cursor:pointer;color:inherit;margin-inline-start:auto}",plugins:{theme:{expose:{"--ok-modal-radius":{default:"var(--ok_radius, 0.5rem)",type:"length",description:"Border radius of modal container",category:"Layout"},"--ok-modal-padding":{default:"var(--ok_padding, 1rem)",type:"length",description:"Padding inside modal",category:"Layout"},"--ok-modal-shadow":{default:"var(--ok_shadow, 0 0 1rem rgba(0,0,0,0.2))",type:"box-shadow",description:"Shadow around modal container",category:"Layout"}}}}};export{a as default};
@@ -0,0 +1 @@
1
+ import t from"../core/transition.ok.js";import o from"../core/ok-layer-service.ok.js";var a={tag:"ok-toast-service",dependencies:[o,{tag:"ok-toast",dependencies:[{tag:"transition",module:t}],attr:{class:{transform:(t,o)=>t.$ok.util.mergeClass(o,t.$attr.type)},icon:{default:""},content:{default:""},type:{default:"info"},duration:{default:5e3},noClose:{default:!1,empty:!0}},template:'<transition name="grow"><div><div class="ok-toast__wrapper"><div class="ok-toast__icon"><if :="$props.icon"><fragment :nodes="$ok.createNodes($props.icon)"/><else>{{ { info: \'💬\', success: \'✅\', error: \'🛑\', warn: \'⚠️\' }[$props.type] || \'\' }}</else></if></div><div class="ok-toast__content"><slot><fragment :nodes="$ok.createNodes($props.content)"/></slot></div><if :="!$props.noClose"><button class="ok-toast__close" @click="$cmp.$dispatch(\'close\')">×</button></if><if :="$props.duration > 0"><div class="ok-toast__progress"><div class="ok-toast__bar" :style="{ animationDuration: $props.duration + \'ms\' }"/></div></if></div></div></transition>',style:"@keyframes ok-toast__progress{to{transform:translateX(-100%)}}[tag]{display:block}[tag] .ok-toast__wrapper{display:flex;align-items:center;gap:.75rem 1rem;padding:.5rem;border-radius:var(--ok-toast-radius, 6px);box-shadow:var(--ok-toast-shadow, 0 4px 12px rgba(0,0,0,0.2));background:var(--ok-toast-bg, #fff);color:var(--ok-toast-color, #000);border:1px solid var(--ok-toast-border, #ccc);position:relative;pointer-events:auto;min-width:240px;overflow:hidden}[tag] .ok-toast__close,[tag] .ok-toast__icon{background-size:contain;background-repeat:no-repeat;background-position:center}[tag] .ok-toast__close{all:unset;border:0;cursor:pointer}[tag] .ok-toast__content{flex-grow:1;font-size:.875rem}[tag] .ok-toast__progress{position:absolute;bottom:0;left:0;height:3px;width:100%;overflow:hidden}[tag] .ok-toast__bar{height:100%;width:100%;animation:ok-toast__progress linear forwards}[tag].info .ok-toast__bar{background:var(--ok-toast-info, #999)}[tag].success .ok-toast__bar{background:var(--ok-toast-success, #12C178)}[tag].error .ok-toast__bar{background:var(--ok-toast-error, #cd7070)}[tag].warn .ok-toast__bar{background:var(--ok-toast-warn, orange)}",plugins:{theme:{expose:{"--ok-toast-radius":{default:"6px",type:"length",category:"Toast"},"--ok-toast-shadow":{default:"0 4px 12px rgba(0,0,0,0.2)",type:"box-shadow",category:"Toast"},"--ok-toast-bg":{default:"#fff",type:"color",category:"Toast"},"--ok-toast-color":{default:"#000",type:"color",category:"Toast"},"--ok-toast-border":{default:"#ccc",type:"color",category:"Toast"},"--ok-toast-info":{default:"#4d7adf",type:"color",category:"Toast"},"--ok-toast-success":{default:"#12C178",type:"color",category:"Toast"},"--ok-toast-error":{default:"#cd7070",type:"color",category:"Toast"},"--ok-toast-warn":{default:"#ef7731",type:"color",category:"Toast"}}}},_toolkit:!0}],register(t,o){t.shared.toast=t.proxy({toasts:[],async add(a){await t.shared.layer.toggle("ok-toast-service",!0,{registration:o,layer:"toast"}).then(()=>{const o=t.proxy({id:Math.random().toString(36).slice(2),type:"info",duration:5e3,...a});this.toasts.push(o),o.duration>0&&setTimeout(()=>this.remove(o),o.duration)})},async info(t,o){await this.add({type:"info",content:t,...o})},async success(t,o){await this.add({type:"success",content:t,...o})},async error(t,o){await this.add({type:"error",content:t,...o})},async warn(t,o){await this.add({type:"warn",content:t,...o})},async clear(){this.toasts=[],await t.shared.layer.toggle("ok-toast-service",!1)},async remove(o){const a=this.toasts.indexOf(o);a>=0&&this.toasts.splice(a,1),this.toasts.length||await t.shared.layer.toggle("ok-toast-service",!1)}})},context:t=>({toast:t.$ok.shared.toast}),template:'<div class="ok-toast">\n <each :of="toast.toasts" let:item>\n <ok-toast :duration="item.duration" :content="item.content" :type="item.type" @close="toast.remove(item)" />\n </each>\n </div>',style:"\n [tag] {\n position: absolute;\n bottom: 1rem;\n right: 1rem;\n z-index: var(--ok-z-toast, 4000);\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n pointer-events: none;\n }"};export{a as default};
@@ -0,0 +1 @@
1
+ import e from"../core/ok-layer-service.ok.js";import o from"../interaction/ok-portal-service.ok.js";let t=[],i=2e3;const r=new WeakMap;function s(e){const o=t.indexOf(e);-1!==o&&t.splice(o,1),t.push(e),t.forEach((e,o)=>{const s=r.get(e),n=i+o;s?.layer?.restackOwner?.(e,{type:"window",tier:s.tier??"window",z:n}),e.classList.toggle("ok-window--active",o===t.length-1)})}var n={tag:"ok-window",dependencies:[e,o],attr:{noClose:{empty:!0},noMaximize:{empty:!0},noPortal:{empty:!0},layer:{default:"window"}},template:'<div class="ok-window__hud ok-window__hud--header" @mousedown="startDrag($event)"><div class="ok-window__header"><div class="ok-window__title">{{ $props.title || \'\' }}</div><if :="!$props.noMaximize"><button class="ok-window__maximize" @click="toggleMaximize">🗖</button></if><if :="!$props.noClose"><button class="ok-window__close" @click="close">×</button></if></div></div><div class="ok-window__body"><slot/></div><if :="$cmp.$cache.templates?.footer"><div class="ok-window__hud ok-window__hud--footer"><div class="ok-window__footer"><slot name="footer"/></div></div></if><div class="ok-window__resizer ok-window__resizer--top" @mousedown="startResize(\'top\', $event)"/><div class="ok-window__resizer ok-window__resizer--right" @mousedown="startResize(\'right\', $event)"/><div class="ok-window__resizer ok-window__resizer--bottom" @mousedown="startResize(\'bottom\', $event)"/><div class="ok-window__resizer ok-window__resizer--left" @mousedown="startResize(\'left\', $event)"/><div class="ok-window__resizer ok-window__resizer--top-left" @mousedown="startResize(\'top-left\', $event)"/><div class="ok-window__resizer ok-window__resizer--top-right" @mousedown="startResize(\'top-right\', $event)"/><div class="ok-window__resizer ok-window__resizer--bottom-left" @mousedown="startResize(\'bottom-left\', $event)"/><div class="ok-window__resizer ok-window__resizer--bottom-right" @mousedown="startResize(\'bottom-right\', $event)"/>',context(e){let o=null;return{close(){e.$el.dispatchEvent(new CustomEvent("close"))},maximize(){const t=e.$el;t.classList.contains("ok-window--maximized")||(t.getBoundingClientRect(),o={left:t.style.left,top:t.style.top,width:t.style.width,height:t.style.height,transform:t.style.transform},t.style.left="0",t.style.top="0",t.style.width="100vw",t.style.height="100vh",t.style.transform="none",t.classList.add("ok-window--maximized"))},restore(){const t=e.$el;t.classList.contains("ok-window--maximized")&&o&&(t.style.left=o.left,t.style.top=o.top,t.style.width=o.width,t.style.height=o.height,t.style.transform=o.transform,t.classList.remove("ok-window--maximized"))},toggleMaximize(){e.$el.classList.contains("ok-window--maximized")?this.restore():this.maximize()},startDrag(o){o.preventDefault();const t=e.$el;s(t);const i=t.getBoundingClientRect(),r=o.clientX-i.left,n=o.clientY-i.top;t.style.width=i.width+"px",t.style.height=i.height+"px";const d=e.$listen(document,"mousemove",e=>{t.style.position="fixed",t.style.left=e.clientX-r+"px",t.style.top=e.clientY-n+"px",t.style.transform="none"}),a=e.$listen(document,"mouseup",()=>{d.stop(),a.stop()})},setupAutohideHUD(e){const o=e.$el;let t;o.classList.add("ok-window--autohidehud");const i=()=>{o.classList.remove("ok-window--idle"),clearTimeout(t);const i=getComputedStyle(o).getPropertyValue("--ok-window_hud-idle-delay").trim(),r=e.$ok.util.parseTimeToMs(i||"5s");t=setTimeout(()=>{o.classList.add("ok-window--idle")},r)};["mousemove","mousedown","touchstart"].forEach(t=>e.$listen(o,t,i)),i(),e.$ext("unmount",()=>{clearTimeout(t)})},startResize(o,t){t.preventDefault();const i=e.$el;s(i);const r=i.getBoundingClientRect(),n=t.clientX,d=t.clientY,a=r.width,l=r.height,w=r.left,c=r.top;i.style.width=`${a}px`,i.style.height=`${l}px`,i.style.left=`${w}px`,i.style.top=`${c}px`,i.style.transform="none";const h=e.$listen(document,"mousemove",e=>{const t=e.clientX-n,r=e.clientY-d;if(o.includes("right")&&(i.style.width=`${Math.max(200,a+t)}px`),o.includes("bottom")&&(i.style.height=`${Math.max(100,l+r)}px`),o.includes("left")){const e=Math.max(200,a-t);i.style.width=`${e}px`,i.style.left=`${w+t}px`}if(o.includes("top")){const e=Math.max(100,l-r);i.style.height=`${e}px`,i.style.top=`${c+r}px`}}),p=e.$listen(document,"mouseup",()=>{h.stop(),p.stop()})}}},mounted(e){const o=e.$ok.shared.layer;i=o?.resolveLayerZ(e.$attr.layer)??i,r.set(e.$el,{layer:o,tier:e.$attr.layer}),s(e.$el);const n=()=>s(e.$el);if(e.$listen(e.$el,"mousedown",n),e.$listen(e.$el,"touchstart",n),e.$attr.noPortal)o?.restackOwner?.(e.$el,{type:"window",tier:e.$attr.layer,z:i+t.indexOf(e.$el)});else{if(e.$__unmount__$||e.$attr.noPortal)return;const o=e.$ok.shared.portal,r=e.$ok.shared.layer;if(!o||!r)return;r.ownerLayer(e.$el,{type:"window",tier:e.$attr.layer,zIndex:i+t.indexOf(e.$el)}).then(t=>{!t||e.$__unmount__$||e.$attr.noPortal||(o.to(e.$el,t),s(e.$el))}),r.restackOwner(e.$el,{type:"window",tier:e.$attr.layer,z:i+t.indexOf(e.$el)}),e.$el.style.pointerEvents="auto",e.$cache.windowPortalActive=!0}null!=e.$attr.autohidehud&&this.setupAutohideHUD(e)},unmounted(e){const o=t.indexOf(e.$el);-1!==o&&t.splice(o,1),e.$cache.windowPortalActive&&(e.$ok.shared.portal?.back(e.$el),e.$cache.windowPortalActive=!1),e.$ok.shared.layer?.clearOwner?.(e.$el),r.delete(e.$el)},style:"[tag]{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);background:var(--ok-window_bg, white);color:var(--ok_fg, black);border-radius:var(--ok-window_radius, 0.5rem);box-shadow:var(--ok-window_shadow, 0 0 1rem rgba(0,0,0,0.2));z-index:var(--ok-window_z, 0);display:flex;flex-direction:column;overflow:hidden;min-width:300px;max-width:90vw;max-height:90vh;min-height:0;width:fit-content;height:fit-content}.ok-window--idle .ok-window__hud,.ok-window__hud{transition:grid-template-rows .3s ease,opacity .3s ease}.ok-window__hud{grid-template-rows:minmax(0,1fr);opacity:1;display:grid!important}.ok-window--idle .ok-window__hud{grid-template-rows:minmax(0,0fr);opacity:0}.ok-window__footer,.ok-window__header{background:var(--ok-window_header-bg, #f5f5f5);display:flex;justify-content:space-between;align-items:center;min-height:fit-content}.ok-window__footer{background:var(--ok-window_footer-bg, #f9f9f9);padding:.5rem 1rem;text-align:right}.ok-window__title{flex:1;padding:.5rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:700;user-select:none}[tag] .ok-window__close,[tag] .ok-window__maximize{all:unset;border:0;padding:.5rem;cursor:pointer;font-size:1.2rem}.ok-window__body{flex-grow:1;display:flex;flex-direction:column;padding:var(--ok-window_padding, 1rem);overflow:auto}.ok-window__resizer{position:absolute;z-index:10}.ok-window__resizer--top{top:-4px;left:0;right:0;height:8px;cursor:ns-resize}.ok-window__resizer--right{top:0;right:-4px;bottom:0;width:8px;cursor:ew-resize}.ok-window__resizer--bottom{bottom:-4px;left:0;right:0;height:8px;cursor:ns-resize}.ok-window__resizer--left{top:0;left:-4px;bottom:0;width:8px;cursor:ew-resize}.ok-window__resizer--top-left{top:-4px;left:-4px;width:12px;height:12px;cursor:nwse-resize}.ok-window__resizer--top-right{top:-4px;right:-4px;width:12px;height:12px;cursor:nesw-resize}.ok-window__resizer--bottom-left{bottom:-4px;left:-4px;width:12px;height:12px;cursor:nesw-resize}.ok-window__resizer--bottom-right{bottom:-4px;right:-4px;width:12px;height:12px;cursor:nwse-resize}.ok-window--active{box-shadow:var(--ok-window_shadow-active, 0 0 1rem rgba(0, 0, 0, 0.4))}.ok-window:not(.ok-window--active){box-shadow:var(--ok-window_shadow-inactive, 0 0 0.5rem rgba(0, 0, 0, 0.1));opacity:.95}.ok-window--maximized{border-radius:0;max-height:100vh;max-width:100vw}.ok-window__hud--header{cursor:grab;min-height:fit-content}.ok-window__hud--header:active{cursor:grabbing}",plugins:{theme:{expose:{"--ok-window_header-bg":{default:"var(--ok_bg-secondary)",type:"color",description:"Window header background color",category:"Colors"},"--ok-window_bg":{default:"var(--ok-surface_bg)",type:"color",description:"Window header background color",category:"Colors"},"--ok-window_footer-bg":{default:"var(--ok-window_bg)",type:"color",description:"Window footer background color",category:"Colors"},"--ok-window_radius":{default:"var(--ok_radius, 0.5rem)",type:"length",description:"Window border radius",category:"Colors"},"--ok-window_shadow":{default:"var(--ok_shadow, 0 0 1rem rgba(0,0,0,0.2))",type:"box-shadow",description:"Window shadow",category:"Colors"},"--ok-window_padding":{default:"var(--ok_padding, 1rem)",type:"length",description:"Content Padding",category:"Layout"},"--ok-window_hud-idle-delay":{default:"5s",type:"delay",description:"HUD idle delay",category:"Timing"}}}}};export{n as default};
@@ -0,0 +1 @@
1
+ import t from"./router.ok.js";var e={tag:"hash-router",unwrap:!0,dependencies:[t],context:t=>({router:null,_push(t,e=null){window.history.pushState(e,"",window.location.pathname+window.location.search+(t?"#"+t:"")),this.location=t},_replace(t,e=null){window.history.replaceState(e,"",window.location.pathname+window.location.search+(t?"#"+t:"")),this.location=t},_back(){window.history.back()},_go(t){window.history.go(t)},location:"",get base(){return t.$attr.base||""},get push(){return this._push.bind(this)},get replace(){return this._replace.bind(this)},get back(){return this._back.bind(this)},get go(){return this._go.bind(this)}}),mount(t){const e=t.$cache.router={};e.onPathChange=()=>{this.location=window.location.hash.slice(1)},window.addEventListener("hashchange",e.onPathChange),t.$once("destroy",()=>window.removeEventListener("hashchange",e.onPathChange)),this.location=window.location.hash.slice(1)},template:'<router @route="$cmp.$cache.events.route?.listener" @mount="router = $scope.$innerContext" :base :parent="$attr.parent" :location :back :go :push :replace><slot var:router/></router>'};export{e as default};
@@ -0,0 +1 @@
1
+ import t from"./router.ok.js";var e={tag:"history-router",unwrap:!1,dependencies:[t],context:t=>({router:null,_push(t,e=null){history.pushState(e,"",t||"/"),this.location=location.pathname+location.search+location.hash},_replace(t,e=null){history.replaceState(e,"",t||"/"),this.location=location.pathname+location.search+location.hash},_back(){history.back()},_go(t){history.go(t)},location:"",get base(){return t.$attr.base||document.baseURI.replace(location.origin,"")},get push(){return this._push.bind(this)},get replace(){return this._replace.bind(this)},get back(){return this._back.bind(this)},get go(){return this._go.bind(this)}}),mount(t){const e=t.$cache.router={};e.onPathChange=()=>{this.location=location.pathname+location.search+location.hash},window.addEventListener("popstate",e.onPathChange),t.$once("destroy",()=>{window.removeEventListener("popstate",e.onPathChange)}),this.location=location.pathname+location.search+location.hash,t.$listen(t.$el,"click",t=>{const e=t.target.closest("a[href]");e&&(e.origin!==location.origin||e.hasAttribute("data-native")||(t.preventDefault(),this._push(e.pathname+e.search+e.hash)))})},template:'<router @route="$cmp.$cache.events.route?.listener" @mount="router = $scope.$innerContext" :base :parent="$attr.parent" :location :back :go :push :replace><slot var:router/></router>'};export{e as default};
@@ -0,0 +1 @@
1
+ function t(t,e){if(e.startsWith("/"))return e;const n=e.startsWith("./")?e.slice(2):e;return t.replace(/\/+$/,"")+"/"+n.replace(/^\/+/,"")}function e(t,e){const n={};if("*"===e)return{params:n,location:t};const a=t.split("/"),r=e.split("/"),s="*"===r[r.length-1],o=s?r.length-1:r.length;if(a.length<o||!s&&a.length!==r.length)return null;for(let t=0;t<r.length;t++){const e=r[t],s=a[t];if("*"===e)break;if(e.startsWith(":"))n[e.slice(1)]=s;else if(e!==s)return null}let h=r.findIndex(t=>"*"===t);-1===h&&(h=r.length);const i=a.slice(0,h).join("/");return s&&(n["*"]=a.slice(h).join("/")),{params:n,location:i}}function n(t=""){const e={};for(const n of t.split("&")){if(!n)continue;const[t,a=""]=n.split("=");e[decodeURIComponent(t)]=decodeURIComponent(a)}return e}function a(t){const e=t.split("#");return[e[0],e.slice(1).join("#")]}function r(t,e){for(const n in e)t[n]=e[n];for(const n in t)n in e||delete t[n]}function s(t,n,a,r){const s=()=>{if(r.orphaned)return r.snapshotParams;r.atPath!==t._path&&(r.atPath=t._path,r.lastMatch=e(t._path,n));const s=r.lastMatch;return null==s||s.location!==a?r.snapshotParams:s.params};return new Proxy(r.snapshotParams,{get:(t,e)=>s()[e],has:(t,e)=>e in s(),ownKeys:()=>Reflect.ownKeys(s()),getOwnPropertyDescriptor:(t,e)=>{const n=s();if(e in n)return{value:n[e],writable:!0,enumerable:!0,configurable:!0}}})}function o(t,n,a,s){const o=()=>{if(s.orphaned)return s.snapshot;s.atPath!==t._path&&(s.atPath=t._path,s.lastMatch=e(t._path,n));const o=s.lastMatch;return null!=o&&o.location===a?(s.lastSearch!==t._search&&(s.lastSearch=t._search,r(s.snapshot,s.lastSearch)),s.lastSearch):s.snapshot};return new Proxy(s.snapshot,{get:(t,e)=>o()[e],has:(t,e)=>e in o(),ownKeys:()=>Reflect.ownKeys(o()),getOwnPropertyDescriptor:(t,e)=>Reflect.getOwnPropertyDescriptor(o(),e),set:(e,n,a)=>(o()===s.snapshot||(t.search[n]=a),!0),deleteProperty:(e,n)=>(o()===s.snapshot||delete t.search[n],!0)})}var h={tag:"router",unwrap:!0,context(h){const i=new Map;return{get router(){return this},_navigationContext:null,_searchString:"",_search:{},_path:"",_anchor:"",get navigationContext(){return this._navigationContext},set navigationContext(t){this._navigationContext=t},get searchString(){return this._searchString},set searchString(t){this.debounceReplace(this.resolve(this._path,n(t),this._anchor),this._navigationContext)},_searchProxy:null,_searchProxyTarget:null,_getSearchProxy(){const t=this._search;if(this._searchProxy&&this._searchProxyTarget===t)return this._searchProxy;const e=this,n=new Proxy(t,{set(t,n,a){const r={...t,[n]:a};return e.debounceReplace(e.resolve(e._path,r,e._anchor),e._navigationContext),!0},deleteProperty(t,n){const a={...t};return delete a[n],e.debounceReplace(e.resolve(e._path,a,e._anchor),e._navigationContext),!0}});return this._searchProxy=n,this._searchProxyTarget=t,n},get search(){return this._getSearchProxy()},set search(t){this.debounceReplace(this.resolve(this._path,t,this._anchor),this._navigationContext)},get path(){return this._path},set path(t){this.debounceReplace(this.resolve(t,this._search,this._anchor),this._navigationContext)},get anchor(){return this._anchor},set anchor(t){const[e]=a(this.location),n=e+(t?"#"+t:"");this.debounceReplace(n,this._navigationContext)},_replaceScheduled:!1,_pendingLocation:null,_pendingNavigationContext:null,debounceReplace(t,e=null){this._pendingNavigationContext=e,this._pendingLocation=t,this._replaceScheduled||(this._replaceScheduled=!0,queueMicrotask(()=>{this._replaceScheduled=!1;const t=this._pendingLocation,e=this._pendingNavigationContext;this._pendingLocation=null,this._pendingNavigationContext=null,this.replace(t,e)}))},match(n){this.location;const a=t(this.base,n),r=i.get(n);let h;if(r&&r.atPath===this._path?h=r.lastMatch:(h=e(this._path,a),r&&(r.atPath=this._path,r.lastMatch=h)),null==h)return r&&(r.orphaned=!0),i.delete(n),null;if(r&&r.matchedLocation===h.location&&function(t,e){const n=Object.keys(t),a=Object.keys(e);if(n.length!==a.length)return!1;for(const a of n)if(t[a]!==e[a])return!1;return!0}(r.lastMatch.params,h.params))return r.route;r&&(r.orphaned=!0);const c={route:null,matchedLocation:h.location,atPath:this._path,lastMatch:h,snapshot:{...this._search},snapshotParams:{...h.params},lastSearch:this._search,orphaned:!1};return c.route={path:a,location:h.location,params:s(this,a,h.location,c),search:o(this,a,h.location,c),router:this},i.set(n,c),c.route},get root(){return this.parent?.root||this},get parent(){return h.$attr.parent},get base(){return h.$attr.base||this.parent?.path||""},get location(){return void 0!==h.$attr.location?h.$attr.location:this.parent?.location||""},back(){const t=h.$attr.back||this.parent?.back;if(!t)throw h.$error("ROUTER_MISSING_BACK");return t()},go(t){const e=h.$attr.go||this.parent?.go;if(!e)throw h.$error("ROUTER_MISSING_GO");return e(t)},push(t,e=null){this._navigationContext=e;const n=h.$attr.push||this.parent?.push;if(!n)throw h.$error("ROUTER_MISSING_PUSH");return n(t,e)},replace(t,e=null){this._navigationContext=e;const n=h.$attr.replace||this.parent?.replace;if(!n)throw h.$error("ROUTER_MISSING_REPLACE");return n(t,e)},resolve:(t,e={},n="")=>t+function(t){const e=Object.entries(t);return e.length?"?"+e.map(([t,e])=>`${encodeURIComponent(t)}=${encodeURIComponent(e)}`).join("&"):""}(e)+(n?"#"+n:""),update(){let s=!1,o=!1,h=!1;const[c,l]=a(this.location),[p,u=""]=c.split("?");if(this._searchString!==u||this._path!==p)for(const t of i.values())t.lastSearch=this._search,r(t.snapshot,this._search),t.lastMatch&&r(t.snapshotParams,t.lastMatch.params);if(this._searchString!==u&&(this._searchString=u,this._search=n(u),s=!0),this._path!==p&&(this._path=p,o=!0),this._anchor!==l&&(this._anchor=l,h=!0),o)for(const[n,a]of i){const r=t(this.base,n),s=e(this._path,r);null==s||s.location!==a.matchedLocation?(a.orphaned=!0,i.delete(n)):(a.atPath=this._path,a.lastMatch=s)}(o||s||h)&&this.emitChange()},emitChange(){h.$el.dispatchEvent(new CustomEvent("route",{detail:this}))}}},mount(t){t.$watch(()=>this.location,()=>{this.update()}),this.update()},template:"<slot var:router/>"};export{h as default};
@@ -0,0 +1 @@
1
+ import*as e from"./reactive-sync.js";import{createReactiveSync as r}from"./reactive-sync.js";var a={tag:"reactive-sync-service",register(a){a.shared.sync={...e,createReactiveSync:(e,c)=>r(e,{OKProxy:a.OK.OKProxy,...c})}}};export{a as default};
@@ -0,0 +1 @@
1
+ function e(e,{path:t,args:s,mode:n,type:r,value:o}){for(let s=0;s<t.length-1;s++)if(!(e=e[t[s]]))return;const a=t[t.length-1];if("array"===r&&Array.isArray(e))switch(n){case"push":e.push(...s);break;case"pop":e.pop();break;case"shift":e.shift();break;case"unshift":e.unshift(...s);break;case"splice":e.splice(...s);break;case"set":e[a]=o;break;case"length":e.length=o}else e[a]=o}function t(t,{mode:s="twoway",transport:n={push:e=>{throw new Error("Not implemented")},send:e=>{throw new Error("Not implemented")},listen:e=>{throw new Error("Not implemented")},requestFetch:e=>{throw new Error("Not implemented")},destroy:()=>{throw new Error("Not implemented")}},OKProxy:r=null}={}){if(!r)throw new Error("OKProxy class is required");const o=t[r.SYM_OKPROXY_INSTANCE];if(!o)throw new Error("Local must be an OKProxy");const a=[];let i=!1,c=!1;const h=e=>{c||(a.push({path:e.path,value:e.value,type:e.raw.type,mode:e.raw.mode,args:e.raw.args}),i||(i=!0,queueMicrotask(async()=>{n.push(a),a.length=0,i=!1})))};let u=null;if("twoway"===s||"push"===s){if(!n.push)throw new Error("push is required on transport");u=o.observeDeep(t,h)}const l={OKProxy:r,get local(){return t},get transport(){return n},destroy(){t=null,u?.stop(),n.destroy?.()},pull(n){"twoway"!==s&&"pull"!==s||(o.frame(()=>{c=!0;for(let s of n)e(t,s)}),c=!1)},receive(e){o.frame(()=>{c=!0;const s=new Set;for(let n of Object.keys(t))t[n]=e[n],s.add(n);for(let n of Object.keys(e))s.has(n)||(t[n]=e[n])}),this._awaitFetchPromise&&(this._awaitFetchPromise.resolve(t),this._awaitFetchPromise=null),c=!1},_awaitFetchPromise:null,awaitFetch(){if(this._awaitFetchPromise)return this._awaitFetchPromise.promise;let e=null;const t=new Promise(t=>{e=t});return this._awaitFetchPromise={promise:t,resolve:e},this._awaitFetchPromise.promise},async fetch(){c=!0,n.requestFetch();const e=await this.awaitFetch();return c=!1,e}};return n.listen?.(l),l}function s(e){return{_contextSync:null,_onMessage(e){if(!this._contextSync)throw new Error("Receiving messages without context");"push"===e.data.type?this._contextSync.pull(JSON.parse(e.data.changes)):"send"===e.data.type?this._contextSync.receive(JSON.parse(e.data.source)):"fetch"===e.data.type&&this.send(this._contextSync.local)},_boundOnMessage:null,listen(t){this._contextSync=t,this._boundOnMessage=this._onMessage.bind(this),e.addEventListener("message",this._boundOnMessage)},destroy(){this._boundOnMessage&&e.removeEventListener("message",this._boundOnMessage)},send(t){const s=t[this._contextSync.OKProxy.SYM_TARGET];e.postMessage({type:"send",source:JSON.stringify(s)})},push(t){e.postMessage({type:"push",changes:JSON.stringify(t)})},requestFetch(){e.postMessage({type:"fetch"})}}}function n(e="ok-sync"){const t=new BroadcastChannel(e),s=Math.random().toString(36).slice(2);return{_contextSync:null,_onMessage(e){if(e.data.senderId===s)return;const t=e.data;this._contextSync&&("push"===t.type?this._contextSync.pull(t.changes):"send"===t.type?this._contextSync.receive(t.source):"fetch"===t.type&&this.send(this._contextSync.local))},listen(e){this._contextSync=e,this._bound=this._onMessage.bind(this),t.addEventListener("message",this._bound)},destroy(){this._bound&&(t.removeEventListener("message",this._bound),this._bound=null),t.close()},send(e){const n=e[this._contextSync.OKProxy.SYM_TARGET];t.postMessage({type:"send",source:n,senderId:s})},push(e){t.postMessage({type:"push",changes:e,senderId:s})},requestFetch(){t.postMessage({type:"fetch",senderId:s})}}}export{n as createBroadcastTransport,t as createReactiveSync,s as createWorkerTransport};
@@ -0,0 +1 @@
1
+ var n="\n/* Default buttons */\n~ button {\n cursor: pointer;\n}\n~ button.active {\n background: var(--ok_bg-accent);\n}\n\n~ button:hover {\n background: color-mix(in srgb, var(--ok_bg) 50%, var(--ok_bg-accent));\n box-shadow: var(--ok_shadow-strong);\n}\n\n~ button:active {\n background: color-mix(in srgb, var(--ok_bg) 90%, var(--ok_fg));\n}\n\n~ button:focus {\n box-shadow: 0 0 0 2px var(--ok_focus-ring);\n outline: none;\n}\n\n~ button:focus-visible {\n box-shadow: 0 0 0 2px var(--ok_focus-ring);\n outline: calc(var(--ok_space-xs)) solid var(--ok_fg-accent);\n}\n\n~ button:disabled {\n opacity: 0.5;\n filter: grayscale(0.3);\n cursor: not-allowed;\n}";export{n as default};
@@ -0,0 +1 @@
1
+ var n='\n~ input[type="range"] {\n outline: none;\n accent-color: var(--ok_fg-accent);\n box-shadow: none;\n}\n\n/* Input / Textarea / Select */\n~ input:focus,\n ~ select:focus,\n ~ textarea:focus {\n \n box-shadow: 0 0 0 2px var(--ok_focus-ring);\n outline: calc(var(--ok_space-xs)) solid var(--ok_fg-accent);\n}\n\n~ input[type="range"]:focus {\n outline: none;\n filter: brightness(1.2);\n box-shadow: none;\n}\n\n~ input[type="range"]:focus::-webkit-slider-thumb {\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--ok_fg-accent) 50%, transparent);\n background-clip: padding-box;\n border: none;\n border-radius: 50%;\n}\n\n~ input[type="range"]:focus::-moz-range-thumb {\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--ok_fg-accent) 50%, transparent);\n background-clip: padding-box;\n border: none;\n border-radius: 50%;\n}\n\n~ input:disabled {\n cursor: not-allowed; \n}';export{n as default};
@@ -0,0 +1 @@
1
+ var n="\n\n/* Reset */\n~ {\n box-sizing: border-box;\n color: var(--ok_fg);\n background: var(--ok_bg);\n font-family: var(--ok_font-family);\n font-size: var(--ok_font-size);\n line-height: var(--ok_line-height-base);\n}\n\n~ *,\n~ *::before,\n~ *::after {\n box-sizing: inherit;\n min-width: 0;\n min-height: 0;\n}\n\n/* Inline elements */\n~ hr {\n border: none;\n border-top: var(--ok_border);\n margin: var(--ok_space) 0;\n}\n\n~ img {\n max-width: 100%;\n height: auto;\n display: block;\n}\n\n~ code {\n font-family: var(--ok_font-family-monospace, monospace);\n background: var(--ok_bg-muted);\n padding: 0 var(--ok_space-xs);\n border-radius: var(--ok_space-xs);\n}\n\n/* Headings */\n~ h1,\n ~ h2,\n ~ h3,\n ~ h4,\n ~ h5,\n ~ h6 {\n color: var(--ok_fg);\n margin: calc(var(--ok_space) * 2) 0 var(--ok_space);\n font-weight: var(--ok_font-weight-bold);\n line-height: 1.2;\n}\n~ h1 { font-size: calc(var(--ok_font-size) * 2); }\n~ h2 { font-size: calc(var(--ok_font-size) * 1.75); }\n~ h3 { font-size: calc(var(--ok_font-size) * 1.5); }\n~ h4 { font-size: calc(var(--ok_font-size) * 1.25); }\n~ h5 { font-size: var(--ok_font-size); }\n~ h6 { font-size: calc(var(--ok_font-size) * 0.875); }\n\n/* Baseline for form elements */\n~ button,\n~ input[type=file]::file-selector-button,\n~ input[type=file]::-webkit-file-upload-button,\n~ input,\n~ select,\n~ textarea {\n font-family: inherit;\n font-size: inherit;\n font-weight: inherit;\n line-height: inherit;\n font-variant-numeric: tabular-nums;\n background: var(--ok_bg);\n padding: var(--ok_space-sm);\n color: var(--ok_fg);\n border: var(--ok_border);\n border-radius: var(--ok_space-xs);\n box-shadow: var(--ok_shadow);\n transition: var(--ok_transition);\n}\n\n/* Links */\n~ a {\n color: var(--ok_fg-accent);\n text-decoration: underline;\n}\n~ a:hover {\n color: color-mix(in srgb, var(--ok_fg-accent) 80%, var(--ok_fg));\n text-decoration: none;\n}\n\n/* ───────────────────────────────────────────────────── */\n/* Flavors: accent / secondary / muted */\n/* ───────────────────────────────────────────────────── */\n~ .accent {\n background: var(--ok_bg-accent);\n color: var(--ok_fg-accent);\n border: var(--ok_border-accent);\n}\n~ .accent:hover {\n background: color-mix(in srgb, var(--ok_bg-accent) 90%, var(--ok_fg-accent));\n}\n~ button.accent.active {\n background: var(--ok_bg);\n}\n\n~ .muted {\n background: var(--ok_bg-muted);\n color: var(--ok_fg-muted);\n border: var(--ok_border-muted);\n}\n~ .muted:hover {\n background: color-mix(in srgb, var(--ok_bg-muted) 90%, var(--ok_fg-accent));\n}\n\n~ .secondary {\n background: var(--ok_bg-secondary);\n color: var(--ok_fg-secondary);\n border: var(--ok_border-secondary);\n}\n~ button.secondary.active {\n background: var(--ok_bg);\n}\n~ .secondary:hover {\n background: color-mix(in srgb, var(--ok_bg-secondary) 90%, black);\n}";export{n as default};