Files
oikos/web/node_modules/svelte-splitpanes/dist/Pane.svelte
dtoro d4d99a7473
Some checks failed
ci / build-test (push) Has been cancelled
ci / docker-build (push) Has been cancelled
feat: Phase 1 — extract the client (web SPA + desktop) to dtoro/oikos-web
Problem: the hexagonal refactor churns the backend tree for nine more
phases; the UI delivery stack (web/ SPA, cmd/desktop Wails wrapper,
compose/web image) must move to its own repo first so doc/layout
rewrites land once on a backend-only tree.

Change:
- New repo git.hubris.network/dtoro/oikos-web (v0.33.0): web/, desktop/
  (updateURL repointed to oikos-web releases), compose/, own CI (web +
  desktop jobs), own deploy script (CI-green gate, TOCTOU guard,
  version-tagged images, prune-to-3), own webhook receiver on :9798 +
  launchd unit, own compose project publishing the same 8091:80.
- Cutover executed on mac-mini in order: oikos stack's web service
  stopped+removed, oikos-web project brought up on 8091; outer Caddy
  untouched (targets the published port) — serving + Authentik flow +
  /wails 404 quirk verified post-cutover.
- Stripped from oikos: web/, cmd/desktop/, compose/web/, desktop CI
  workflow, ci.yml web job, Makefile ui/desktop/desktop-package/install
  targets, the compose web service, oikos-web from deploy.sh's fallback
  prune list; wails + go-keyring dropped from go.mod, vendor synced.
- README / CONTRIBUTING / AGENTS.md / .agents dev+operations docs now
  point at the new repo; mbse + mascot design docs carry a path note.

Risk: production SPA serving depends on the new pipeline now; rollback
is versioned-image re-up of the old web service from a pre-split
checkout (port 8091). Desktop builds installed before the split still
check dtoro/oikos releases — one manual reinstall, noted in the
oikos-web release notes.

Verification: go vet, make test (race), make generate-check, golangci
(no new findings; baseline down 400→365); post-cutover curls —
localhost:8091 200, /wails/runtime.js 404, outer Caddy 302 Authentik.
2026-08-15 22:27:52 +02:00

109 lines
3.7 KiB
Svelte

<script lang="ts">import { getContext, onMount, onDestroy, hasContext } from 'svelte';
import { KEY } from './Splitpanes.svelte';
import { browser } from './internal/env.js';
import { gatheringKey } from './internal/GatheringRound.svelte';
import { getDimensionName } from './internal/utils/sizing.js';
import { carefullCallbackSource } from './internal/utils/functions';
const { ssrRegisterPaneSize, onPaneInit, clientOnly: clientOnlyContext, isHorizontal, showFirstSplitter, veryFirstPaneKey } = getContext(KEY);
// PROPS
export let size = null;
export let minSize = 0;
export let maxSize = 100;
export let snapSize = 0;
// css class
let clazz = '';
export { clazz as class };
// VARIABLES
const key = {};
const gathering = !browser && hasContext(gatheringKey);
const { undefinedPaneInitSize } = (!gathering ? onPaneInit(key) : {});
let element;
let sz = size ?? undefinedPaneInitSize;
let isSplitterActive = false;
// CALLBACKS
let clientCallbacks = undefined;
/**
* This is an object of callbacks that are safe to be called on browser even when the object `clientCallbacks`
* isn't initialized yet (i.e. before `onPaneAdd()`).
*
* In the case of the object isn't initialized yet, calling this callbacks will do nothing.
*/
const carefullClientCallbacks = browser
? carefullCallbackSource(() => clientCallbacks)
: undefined;
const reportGivenSizeChangeSafe = (size) => {
// We put an extra check of `size != sz` here and not in the reactive statement, since we don't want a change
// of `sz` to trigger report.
if (clientCallbacks && size != sz) {
carefullClientCallbacks?.('reportGivenSizeChange')(size);
}
};
// REACTIVE
$: {
if (browser && typeof size === 'number') {
reportGivenSizeChangeSafe(size);
}
}
$: dimension = getDimensionName($isHorizontal);
$: style = `${dimension}: ${sz}%;`;
if (gathering && ssrRegisterPaneSize) {
ssrRegisterPaneSize(size);
}
else if (browser) {
onMount(() => {
const inst = {
index: 0,
key,
element: element,
givenSize: size,
sz: () => sz,
setSz: v => {
sz = v;
if (typeof size === 'number' && size !== sz) {
size = sz;
}
},
min: () => minSize,
max: () => maxSize,
snap: () => snapSize,
setSplitterActive: (isActive) => {
isSplitterActive = isActive;
},
isReady: false
};
clientCallbacks = clientOnlyContext?.onPaneAdd(inst);
});
onDestroy(() => {
clientOnlyContext?.onPaneRemove(key);
});
}
</script>
{#if !gathering}
<!-- Splitter -->
{#if $veryFirstPaneKey !== key || $showFirstSplitter}
<!-- this a11y issue is known, and will be taken care of as part of the a11y feature issue in #11 -->
<!-- svelte-ignore a11y-click-events-have-key-events -->
<!-- svelte-ignore a11y-no-static-element-interactions -->
<div
class="splitpanes__splitter {isSplitterActive ? 'splitpanes__splitter__active' : ''}"
on:mousedown={carefullClientCallbacks?.('onSplitterDown')}
on:touchstart={carefullClientCallbacks?.('onSplitterDown')}
on:click={carefullClientCallbacks?.('onSplitterClick')}
on:dblclick={carefullClientCallbacks?.('onSplitterDblClick')}>
</div>
{/if}
<!-- Pane -->
<!-- this a11y issue is known, and will be taken care of as part of the a11y feature issue in #11 -->
<!-- svelte-ignore a11y-click-events-have-key-events -->
<!-- svelte-ignore a11y-no-static-element-interactions -->
<div
class={`splitpanes__pane ${clazz || ''}`}
bind:this={element}
on:click={carefullClientCallbacks?.('onPaneClick')}
{style}>
<slot />
</div>
{/if}