@ohhwells/bridge 0.1.150 → 0.1.151-next.408
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.
- package/README.md +1 -1
- package/dist/index.cjs +1543 -1182
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +98 -2
- package/dist/index.d.ts +98 -2
- package/dist/index.js +1495 -1133
- package/dist/index.js.map +1 -1
- package/dist/pages.cjs +1 -1
- package/dist/pages.cjs.map +1 -1
- package/dist/pages.js +1 -1
- package/dist/pages.js.map +1 -1
- package/dist/styles.css +116 -0
- package/package.json +3 -3
package/dist/pages.cjs
CHANGED
package/dist/pages.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/pages.ts","../src/lib/site-pages.ts","../src/lib/site-pages-middleware.ts","../src/lib/site-pages-render.ts"],"sourcesContent":["// Server-safe entry point (no 'use client' banner) — for middleware/Edge runtime and\n// Server Components. Keep this file free of React component exports; UI goes in the\n// default `@ohhwells/bridge` entry (src/index.ts).\nexport {\n DELETED_PAGE_PREFIX,\n resolveSubdomain,\n fetchSitePages,\n resolvePageRewrite,\n resolveSitePage,\n} from './lib/site-pages'\nexport type { SitePage, PageRewriteDecision, SitePageResolution } from './lib/site-pages'\nexport { sitePagesMiddleware, sitePagesMiddlewareConfig } from './lib/site-pages-middleware'\nexport { renderCatchAllPage } from './lib/site-pages-render'\nexport type { CatchAllPageHandlers } from './lib/site-pages-render'\n","// Shared page-CRUD infra (OHH-670): fetching a site's page list and deciding how the\n// catch-all route / middleware should handle deleted, renamed, and duplicated pages.\n// Server-safe (no React/browser APIs) so it can run in middleware (Edge runtime) and\n// Server Components — kept out of the main client-bundled entry point, see `../pages.ts`.\n\n// Prefix used to route deleted-physical-page requests into the catch-all `[...page]`\n// route, which has no file of its own at that segment and calls notFound() for it.\nexport const DELETED_PAGE_PREFIX = '/__ohw-deleted'\n\nexport type SitePage = {\n id: string\n path: string\n title: string\n is_physical: boolean\n original_path: string | null\n duplicated_from: string | null\n is_deleted: boolean\n}\n\n// Mirrors OhhwellsBridge's client-side resolveSubdomain: prefer the real request hostname\n// (window.location isn't available on the server, so callers pass the Host header/nextUrl\n// hostname instead) and only fall back to the NEXT_PUBLIC_SITE_URL env var when no hostname\n// is known — the only case that's true in local dev, where the host is just localhost.\nexport function resolveSubdomain(hostnameOverride?: string): string {\n if (hostnameOverride) {\n const parts = hostnameOverride.split('.')\n if (parts.length >= 3 && parts[0] !== 'www') return parts[0]\n }\n\n const siteUrl = process.env.NEXT_PUBLIC_SITE_URL\n if (!siteUrl) return ''\n try {\n const parts = new URL(siteUrl).hostname.split('.')\n if (parts.length >= 3 && parts[0] !== 'www') return parts[0]\n } catch {\n // ignore malformed env value\n }\n return ''\n}\n\n// `subdomainOverride` is the `?subdomain=` query param the canvas editor's iframe appends\n// (see `editUrl` in fo-class-experience). It's required locally: NEXT_PUBLIC_SITE_URL is\n// `http://localhost:3000` in dev, which resolveSubdomain() can't parse a subdomain from.\nexport async function fetchSitePages(subdomainOverride?: string): Promise<SitePage[]> {\n const subdomain = subdomainOverride || resolveSubdomain()\n const apiUrl = process.env.NEXT_PUBLIC_FLOWOPS_API_URL\n if (!subdomain || !apiUrl) return []\n\n try {\n // no-store, not a timed revalidate: middleware uses this list to decide whether a\n // path is deleted/renamed, and `next start`'s persistent Data Cache would otherwise\n // keep routing a just-deleted page's URL to its live content for longer than expected.\n const res = await fetch(`${apiUrl}/api/public/sites/${subdomain}/pages`, {\n cache: 'no-store',\n })\n if (!res.ok) return []\n const { pages } = (await res.json()) as { pages: SitePage[] }\n return pages\n } catch {\n return []\n }\n}\n\nexport type PageRewriteDecision = { path: string } | null\n\n// Middleware decision logic: given the current pathname and the site's page list, decide\n// whether to rewrite to the deleted-page placeholder or to a renamed physical page's real\n// file location. Callers still own the `_next`/`api`/static-file early-return and the actual\n// `NextResponse.rewrite` call, since those are Next.js-specific.\nexport function resolvePageRewrite(pathname: string, pages: SitePage[]): PageRewriteDecision {\n const current = pages.find((page) => page.path === pathname)\n\n if (current) {\n if (current.is_deleted) return { path: `${DELETED_PAGE_PREFIX}${pathname}` }\n // Renamed physical page: the file still lives at original_path, so rewrite there\n // internally while the browser keeps showing the new canonical path.\n if (current.is_physical && current.original_path && current.original_path !== current.path) {\n return { path: current.original_path }\n }\n return null\n }\n\n // Old URL of a renamed physical page — no redirect, it just no longer resolves to\n // anything (whether or not the page has since also been deleted).\n const oldUrlOfRenamed = pages.find(\n (page) => page.is_physical && page.original_path === pathname && page.path !== pathname,\n )\n if (oldUrlOfRenamed) return { path: `${DELETED_PAGE_PREFIX}${pathname}` }\n\n return null\n}\n\nexport type SitePageResolution =\n | { kind: 'not-found' }\n | { kind: 'duplicate'; sourceSegment: string; page: SitePage }\n | { kind: 'blank'; page: SitePage }\n\n// Catch-all route lookup: given the route's path segments, resolve which page (if any) this\n// request maps to. Callers still own the dynamic `import()` for `kind: 'duplicate'` — that\n// needs a literal relative path per app for webpack's static context analysis to work, so it\n// can't live in this shared package (see the comment at the call site).\nexport async function resolveSitePage(segments: string[], subdomainOverride?: string): Promise<SitePageResolution> {\n if (`/${segments[0]}` === DELETED_PAGE_PREFIX) return { kind: 'not-found' }\n\n const path = `/${segments.join('/')}`\n const pages = await fetchSitePages(subdomainOverride)\n const page = pages.find((entry) => entry.path === path && !entry.is_deleted)\n if (!page) return { kind: 'not-found' }\n\n if (page.duplicated_from) {\n const sourceSegment = page.duplicated_from === '/' ? '' : page.duplicated_from.replace(/^\\//, '')\n return { kind: 'duplicate', sourceSegment, page }\n }\n\n return { kind: 'blank', page }\n}\n","import { NextRequest, NextResponse } from 'next/server'\nimport { fetchSitePages, resolvePageRewrite, resolveSubdomain } from './site-pages'\n\n// Drop-in Next.js middleware for the OHH-670 page-CRUD system: rewrites deleted/renamed\n// pages to the right place before the catch-all route (see `resolveSitePage`) ever runs.\n// Apps that need extra middleware logic of their own can still compose `fetchSitePages`/\n// `resolvePageRewrite` directly instead of using this wrapper.\nexport async function sitePagesMiddleware(request: NextRequest): Promise<NextResponse> {\n const { pathname } = request.nextUrl\n\n if (pathname.startsWith('/_next') || pathname.startsWith('/api') || /\\.[a-zA-Z0-9]+$/.test(pathname)) {\n return NextResponse.next()\n }\n\n // `?subdomain=` is the canvas editor iframe's override (its own origin isn't the site's\n // real domain). Every other request — every real visitor — hits the site's actual\n // `*.ohhwells.site`/custom domain, so the request's own hostname is the source of truth\n // there; without this fallback the middleware silently no-ops on every production request.\n const subdomain =\n request.nextUrl.searchParams.get('subdomain') || resolveSubdomain(request.nextUrl.hostname)\n const pages = await fetchSitePages(subdomain || undefined)\n if (pages.length === 0) return NextResponse.next()\n\n const decision = resolvePageRewrite(pathname, pages)\n if (!decision) return NextResponse.next()\n return NextResponse.rewrite(new URL(decision.path, request.url))\n}\n\n// Mirrors the `_next`/`api` early-return above so apps that re-export this directly as\n// their middleware `config` don't invoke the function needlessly on asset requests.\nexport const sitePagesMiddlewareConfig = {\n matcher: ['/((?!_next|api).*)'],\n}\n","import { headers } from 'next/headers'\nimport { notFound } from 'next/navigation'\nimport { createElement, type ComponentType, type ReactElement } from 'react'\nimport { resolveSitePage, resolveSubdomain, type SitePage } from './site-pages'\n\nexport interface CatchAllPageHandlers {\n // Called for a page that's a duplicate of another. Must contain the actual `import(...)`\n // call itself (relative, not the `@` alias) — webpack can only build a static context\n // module (bundling every matching src/app/*/page.tsx) when the prefix is a real relative\n // path, so this one expression has to stay in the calling app's own file, resolved against\n // its own src/app tree, not this shared package's. Everything else about turning the\n // resolved module into a rendered element lives here instead.\n renderDuplicate: (sourceSegment: string) => Promise<{ default: ComponentType }>\n // Called for a page with no section content of its own yet.\n renderBlank: (page: SitePage) => ReactElement\n}\n\n// Full catch-all route resolution for the OHH-670 page-CRUD system: looks the page up,\n// calls `notFound()` for anything unresolved, and delegates to the two things every\n// consuming app still owns (the duplicate-source import and its blank-page chrome).\nexport async function renderCatchAllPage(\n segments: string[],\n subdomainOverride: string | undefined,\n handlers: CatchAllPageHandlers,\n): Promise<ReactElement> {\n // `subdomainOverride` is the canvas editor iframe's `?subdomain=` query param — its own\n // origin isn't the site's real domain. Every real visitor hits the site's actual\n // `*.ohhwells.site`/custom domain, so fall back to the request's own Host header there,\n // mirroring `sitePagesMiddleware`'s hostname fallback.\n const host = (await headers()).get('host') ?? undefined\n const subdomain = subdomainOverride || resolveSubdomain(host) || undefined\n const result = await resolveSitePage(segments, subdomain)\n\n if (result.kind === 'not-found') notFound()\n\n if (result.kind === 'duplicate') {\n try {\n const sourceModule = await handlers.renderDuplicate(result.sourceSegment)\n return createElement(sourceModule.default)\n } catch {\n notFound()\n }\n }\n\n return handlers.renderBlank(result.page)\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/pages.ts","../src/lib/site-pages.ts","../src/lib/site-pages-middleware.ts","../src/lib/site-pages-render.ts"],"sourcesContent":["// Server-safe entry point (no 'use client' banner) — for middleware/Edge runtime and\n// Server Components. Keep this file free of React component exports; UI goes in the\n// default `@ohhwells/bridge` entry (src/index.ts).\nexport {\n DELETED_PAGE_PREFIX,\n resolveSubdomain,\n fetchSitePages,\n resolvePageRewrite,\n resolveSitePage,\n} from './lib/site-pages'\nexport type { SitePage, PageRewriteDecision, SitePageResolution } from './lib/site-pages'\nexport { sitePagesMiddleware, sitePagesMiddlewareConfig } from './lib/site-pages-middleware'\nexport { renderCatchAllPage } from './lib/site-pages-render'\nexport type { CatchAllPageHandlers } from './lib/site-pages-render'\n","// Shared page-CRUD infra (OHH-670): fetching a site's page list and deciding how the\n// catch-all route / middleware should handle deleted, renamed, and duplicated pages.\n// Server-safe (no React/browser APIs) so it can run in middleware (Edge runtime) and\n// Server Components — kept out of the main client-bundled entry point, see `../pages.ts`.\n\n// Prefix used to route deleted-physical-page requests into the catch-all `[...page]`\n// route, which has no file of its own at that segment and calls notFound() for it.\nexport const DELETED_PAGE_PREFIX = '/__ohw-deleted'\n\nexport type SitePage = {\n id: string\n path: string\n title: string\n is_physical: boolean\n original_path: string | null\n duplicated_from: string | null\n is_deleted: boolean\n}\n\n// Mirrors OhhwellsBridge's client-side resolveSubdomain: prefer the real request hostname\n// (window.location isn't available on the server, so callers pass the Host header/nextUrl\n// hostname instead) and only fall back to the NEXT_PUBLIC_SITE_URL env var when no hostname\n// is known — the only case that's true in local dev, where the host is just localhost.\nexport function resolveSubdomain(hostnameOverride?: string): string {\n if (hostnameOverride) {\n const parts = hostnameOverride.split('.')\n if (parts.length >= 3 && parts[0] !== 'www') return parts[0]\n }\n\n const siteUrl = process.env.NEXT_PUBLIC_SITE_URL\n if (!siteUrl) return ''\n try {\n const parts = new URL(siteUrl).hostname.split('.')\n if (parts.length >= 3 && parts[0] !== 'www') return parts[0]\n } catch {\n // ignore malformed env value\n }\n return ''\n}\n\n// `subdomainOverride` is the `?subdomain=` query param the canvas editor's iframe appends\n// (see `editUrl` in fo-class-experience). It's required locally: NEXT_PUBLIC_SITE_URL is\n// `http://localhost:3000` in dev, which resolveSubdomain() can't parse a subdomain from.\nexport async function fetchSitePages(subdomainOverride?: string): Promise<SitePage[]> {\n const subdomain = subdomainOverride || resolveSubdomain()\n const apiUrl = process.env.NEXT_PUBLIC_FLOWOPS_API_URL\n if (!subdomain || !apiUrl) return []\n\n try {\n // no-store, not a timed revalidate: middleware uses this list to decide whether a\n // path is deleted/renamed, and `next start`'s persistent Data Cache would otherwise\n // keep routing a just-deleted page's URL to its live content for longer than expected.\n const res = await fetch(`${apiUrl}/api/public/sites/${subdomain}/pages`, {\n cache: 'no-store',\n })\n if (!res.ok) return []\n const { pages } = (await res.json()) as { pages?: SitePage[] }\n\n // A reply without a list is not a list of none — the endpoint answers 200 with an empty body\n // when its own lookup failed. Handing that straight back put `undefined` into middleware and\n // took the whole site down with a 500 on every request.\n return pages ?? []\n } catch {\n return []\n }\n}\n\nexport type PageRewriteDecision = { path: string } | null\n\n// Middleware decision logic: given the current pathname and the site's page list, decide\n// whether to rewrite to the deleted-page placeholder or to a renamed physical page's real\n// file location. Callers still own the `_next`/`api`/static-file early-return and the actual\n// `NextResponse.rewrite` call, since those are Next.js-specific.\nexport function resolvePageRewrite(pathname: string, pages: SitePage[]): PageRewriteDecision {\n const current = pages.find((page) => page.path === pathname)\n\n if (current) {\n if (current.is_deleted) return { path: `${DELETED_PAGE_PREFIX}${pathname}` }\n // Renamed physical page: the file still lives at original_path, so rewrite there\n // internally while the browser keeps showing the new canonical path.\n if (current.is_physical && current.original_path && current.original_path !== current.path) {\n return { path: current.original_path }\n }\n return null\n }\n\n // Old URL of a renamed physical page — no redirect, it just no longer resolves to\n // anything (whether or not the page has since also been deleted).\n const oldUrlOfRenamed = pages.find(\n (page) => page.is_physical && page.original_path === pathname && page.path !== pathname,\n )\n if (oldUrlOfRenamed) return { path: `${DELETED_PAGE_PREFIX}${pathname}` }\n\n return null\n}\n\nexport type SitePageResolution =\n | { kind: 'not-found' }\n | { kind: 'duplicate'; sourceSegment: string; page: SitePage }\n | { kind: 'blank'; page: SitePage }\n\n// Catch-all route lookup: given the route's path segments, resolve which page (if any) this\n// request maps to. Callers still own the dynamic `import()` for `kind: 'duplicate'` — that\n// needs a literal relative path per app for webpack's static context analysis to work, so it\n// can't live in this shared package (see the comment at the call site).\nexport async function resolveSitePage(segments: string[], subdomainOverride?: string): Promise<SitePageResolution> {\n if (`/${segments[0]}` === DELETED_PAGE_PREFIX) return { kind: 'not-found' }\n\n const path = `/${segments.join('/')}`\n const pages = await fetchSitePages(subdomainOverride)\n const page = pages.find((entry) => entry.path === path && !entry.is_deleted)\n if (!page) return { kind: 'not-found' }\n\n if (page.duplicated_from) {\n const sourceSegment = page.duplicated_from === '/' ? '' : page.duplicated_from.replace(/^\\//, '')\n return { kind: 'duplicate', sourceSegment, page }\n }\n\n return { kind: 'blank', page }\n}\n","import { NextRequest, NextResponse } from 'next/server'\nimport { fetchSitePages, resolvePageRewrite, resolveSubdomain } from './site-pages'\n\n// Drop-in Next.js middleware for the OHH-670 page-CRUD system: rewrites deleted/renamed\n// pages to the right place before the catch-all route (see `resolveSitePage`) ever runs.\n// Apps that need extra middleware logic of their own can still compose `fetchSitePages`/\n// `resolvePageRewrite` directly instead of using this wrapper.\nexport async function sitePagesMiddleware(request: NextRequest): Promise<NextResponse> {\n const { pathname } = request.nextUrl\n\n if (pathname.startsWith('/_next') || pathname.startsWith('/api') || /\\.[a-zA-Z0-9]+$/.test(pathname)) {\n return NextResponse.next()\n }\n\n // `?subdomain=` is the canvas editor iframe's override (its own origin isn't the site's\n // real domain). Every other request — every real visitor — hits the site's actual\n // `*.ohhwells.site`/custom domain, so the request's own hostname is the source of truth\n // there; without this fallback the middleware silently no-ops on every production request.\n const subdomain =\n request.nextUrl.searchParams.get('subdomain') || resolveSubdomain(request.nextUrl.hostname)\n const pages = await fetchSitePages(subdomain || undefined)\n if (pages.length === 0) return NextResponse.next()\n\n const decision = resolvePageRewrite(pathname, pages)\n if (!decision) return NextResponse.next()\n return NextResponse.rewrite(new URL(decision.path, request.url))\n}\n\n// Mirrors the `_next`/`api` early-return above so apps that re-export this directly as\n// their middleware `config` don't invoke the function needlessly on asset requests.\nexport const sitePagesMiddlewareConfig = {\n matcher: ['/((?!_next|api).*)'],\n}\n","import { headers } from 'next/headers'\nimport { notFound } from 'next/navigation'\nimport { createElement, type ComponentType, type ReactElement } from 'react'\nimport { resolveSitePage, resolveSubdomain, type SitePage } from './site-pages'\n\nexport interface CatchAllPageHandlers {\n // Called for a page that's a duplicate of another. Must contain the actual `import(...)`\n // call itself (relative, not the `@` alias) — webpack can only build a static context\n // module (bundling every matching src/app/*/page.tsx) when the prefix is a real relative\n // path, so this one expression has to stay in the calling app's own file, resolved against\n // its own src/app tree, not this shared package's. Everything else about turning the\n // resolved module into a rendered element lives here instead.\n renderDuplicate: (sourceSegment: string) => Promise<{ default: ComponentType }>\n // Called for a page with no section content of its own yet.\n renderBlank: (page: SitePage) => ReactElement\n}\n\n// Full catch-all route resolution for the OHH-670 page-CRUD system: looks the page up,\n// calls `notFound()` for anything unresolved, and delegates to the two things every\n// consuming app still owns (the duplicate-source import and its blank-page chrome).\nexport async function renderCatchAllPage(\n segments: string[],\n subdomainOverride: string | undefined,\n handlers: CatchAllPageHandlers,\n): Promise<ReactElement> {\n // `subdomainOverride` is the canvas editor iframe's `?subdomain=` query param — its own\n // origin isn't the site's real domain. Every real visitor hits the site's actual\n // `*.ohhwells.site`/custom domain, so fall back to the request's own Host header there,\n // mirroring `sitePagesMiddleware`'s hostname fallback.\n const host = (await headers()).get('host') ?? undefined\n const subdomain = subdomainOverride || resolveSubdomain(host) || undefined\n const result = await resolveSitePage(segments, subdomain)\n\n if (result.kind === 'not-found') notFound()\n\n if (result.kind === 'duplicate') {\n try {\n const sourceModule = await handlers.renderDuplicate(result.sourceSegment)\n return createElement(sourceModule.default)\n } catch {\n notFound()\n }\n }\n\n return handlers.renderBlank(result.page)\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACOO,IAAM,sBAAsB;AAgB5B,SAAS,iBAAiB,kBAAmC;AAClE,MAAI,kBAAkB;AACpB,UAAM,QAAQ,iBAAiB,MAAM,GAAG;AACxC,QAAI,MAAM,UAAU,KAAK,MAAM,CAAC,MAAM,MAAO,QAAO,MAAM,CAAC;AAAA,EAC7D;AAEA,QAAM,UAAU,QAAQ,IAAI;AAC5B,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI;AACF,UAAM,QAAQ,IAAI,IAAI,OAAO,EAAE,SAAS,MAAM,GAAG;AACjD,QAAI,MAAM,UAAU,KAAK,MAAM,CAAC,MAAM,MAAO,QAAO,MAAM,CAAC;AAAA,EAC7D,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAKA,eAAsB,eAAe,mBAAiD;AACpF,QAAM,YAAY,qBAAqB,iBAAiB;AACxD,QAAM,SAAS,QAAQ,IAAI;AAC3B,MAAI,CAAC,aAAa,CAAC,OAAQ,QAAO,CAAC;AAEnC,MAAI;AAIF,UAAM,MAAM,MAAM,MAAM,GAAG,MAAM,qBAAqB,SAAS,UAAU;AAAA,MACvE,OAAO;AAAA,IACT,CAAC;AACD,QAAI,CAAC,IAAI,GAAI,QAAO,CAAC;AACrB,UAAM,EAAE,MAAM,IAAK,MAAM,IAAI,KAAK;AAKlC,WAAO,SAAS,CAAC;AAAA,EACnB,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAQO,SAAS,mBAAmB,UAAkB,OAAwC;AAC3F,QAAM,UAAU,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,QAAQ;AAE3D,MAAI,SAAS;AACX,QAAI,QAAQ,WAAY,QAAO,EAAE,MAAM,GAAG,mBAAmB,GAAG,QAAQ,GAAG;AAG3E,QAAI,QAAQ,eAAe,QAAQ,iBAAiB,QAAQ,kBAAkB,QAAQ,MAAM;AAC1F,aAAO,EAAE,MAAM,QAAQ,cAAc;AAAA,IACvC;AACA,WAAO;AAAA,EACT;AAIA,QAAM,kBAAkB,MAAM;AAAA,IAC5B,CAAC,SAAS,KAAK,eAAe,KAAK,kBAAkB,YAAY,KAAK,SAAS;AAAA,EACjF;AACA,MAAI,gBAAiB,QAAO,EAAE,MAAM,GAAG,mBAAmB,GAAG,QAAQ,GAAG;AAExE,SAAO;AACT;AAWA,eAAsB,gBAAgB,UAAoB,mBAAyD;AACjH,MAAI,IAAI,SAAS,CAAC,CAAC,OAAO,oBAAqB,QAAO,EAAE,MAAM,YAAY;AAE1E,QAAM,OAAO,IAAI,SAAS,KAAK,GAAG,CAAC;AACnC,QAAM,QAAQ,MAAM,eAAe,iBAAiB;AACpD,QAAM,OAAO,MAAM,KAAK,CAAC,UAAU,MAAM,SAAS,QAAQ,CAAC,MAAM,UAAU;AAC3E,MAAI,CAAC,KAAM,QAAO,EAAE,MAAM,YAAY;AAEtC,MAAI,KAAK,iBAAiB;AACxB,UAAM,gBAAgB,KAAK,oBAAoB,MAAM,KAAK,KAAK,gBAAgB,QAAQ,OAAO,EAAE;AAChG,WAAO,EAAE,MAAM,aAAa,eAAe,KAAK;AAAA,EAClD;AAEA,SAAO,EAAE,MAAM,SAAS,KAAK;AAC/B;;;ACvHA,oBAA0C;AAO1C,eAAsB,oBAAoB,SAA6C;AACrF,QAAM,EAAE,SAAS,IAAI,QAAQ;AAE7B,MAAI,SAAS,WAAW,QAAQ,KAAK,SAAS,WAAW,MAAM,KAAK,kBAAkB,KAAK,QAAQ,GAAG;AACpG,WAAO,2BAAa,KAAK;AAAA,EAC3B;AAMA,QAAM,YACJ,QAAQ,QAAQ,aAAa,IAAI,WAAW,KAAK,iBAAiB,QAAQ,QAAQ,QAAQ;AAC5F,QAAM,QAAQ,MAAM,eAAe,aAAa,MAAS;AACzD,MAAI,MAAM,WAAW,EAAG,QAAO,2BAAa,KAAK;AAEjD,QAAM,WAAW,mBAAmB,UAAU,KAAK;AACnD,MAAI,CAAC,SAAU,QAAO,2BAAa,KAAK;AACxC,SAAO,2BAAa,QAAQ,IAAI,IAAI,SAAS,MAAM,QAAQ,GAAG,CAAC;AACjE;AAIO,IAAM,4BAA4B;AAAA,EACvC,SAAS,CAAC,oBAAoB;AAChC;;;AChCA,qBAAwB;AACxB,wBAAyB;AACzB,mBAAqE;AAkBrE,eAAsB,mBACpB,UACA,mBACA,UACuB;AAKvB,QAAM,QAAQ,UAAM,wBAAQ,GAAG,IAAI,MAAM,KAAK;AAC9C,QAAM,YAAY,qBAAqB,iBAAiB,IAAI,KAAK;AACjE,QAAM,SAAS,MAAM,gBAAgB,UAAU,SAAS;AAExD,MAAI,OAAO,SAAS,YAAa,iCAAS;AAE1C,MAAI,OAAO,SAAS,aAAa;AAC/B,QAAI;AACF,YAAM,eAAe,MAAM,SAAS,gBAAgB,OAAO,aAAa;AACxE,iBAAO,4BAAc,aAAa,OAAO;AAAA,IAC3C,QAAQ;AACN,sCAAS;AAAA,IACX;AAAA,EACF;AAEA,SAAO,SAAS,YAAY,OAAO,IAAI;AACzC;","names":[]}
|
package/dist/pages.js
CHANGED
package/dist/pages.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/site-pages.ts","../src/lib/site-pages-middleware.ts","../src/lib/site-pages-render.ts"],"sourcesContent":["// Shared page-CRUD infra (OHH-670): fetching a site's page list and deciding how the\n// catch-all route / middleware should handle deleted, renamed, and duplicated pages.\n// Server-safe (no React/browser APIs) so it can run in middleware (Edge runtime) and\n// Server Components — kept out of the main client-bundled entry point, see `../pages.ts`.\n\n// Prefix used to route deleted-physical-page requests into the catch-all `[...page]`\n// route, which has no file of its own at that segment and calls notFound() for it.\nexport const DELETED_PAGE_PREFIX = '/__ohw-deleted'\n\nexport type SitePage = {\n id: string\n path: string\n title: string\n is_physical: boolean\n original_path: string | null\n duplicated_from: string | null\n is_deleted: boolean\n}\n\n// Mirrors OhhwellsBridge's client-side resolveSubdomain: prefer the real request hostname\n// (window.location isn't available on the server, so callers pass the Host header/nextUrl\n// hostname instead) and only fall back to the NEXT_PUBLIC_SITE_URL env var when no hostname\n// is known — the only case that's true in local dev, where the host is just localhost.\nexport function resolveSubdomain(hostnameOverride?: string): string {\n if (hostnameOverride) {\n const parts = hostnameOverride.split('.')\n if (parts.length >= 3 && parts[0] !== 'www') return parts[0]\n }\n\n const siteUrl = process.env.NEXT_PUBLIC_SITE_URL\n if (!siteUrl) return ''\n try {\n const parts = new URL(siteUrl).hostname.split('.')\n if (parts.length >= 3 && parts[0] !== 'www') return parts[0]\n } catch {\n // ignore malformed env value\n }\n return ''\n}\n\n// `subdomainOverride` is the `?subdomain=` query param the canvas editor's iframe appends\n// (see `editUrl` in fo-class-experience). It's required locally: NEXT_PUBLIC_SITE_URL is\n// `http://localhost:3000` in dev, which resolveSubdomain() can't parse a subdomain from.\nexport async function fetchSitePages(subdomainOverride?: string): Promise<SitePage[]> {\n const subdomain = subdomainOverride || resolveSubdomain()\n const apiUrl = process.env.NEXT_PUBLIC_FLOWOPS_API_URL\n if (!subdomain || !apiUrl) return []\n\n try {\n // no-store, not a timed revalidate: middleware uses this list to decide whether a\n // path is deleted/renamed, and `next start`'s persistent Data Cache would otherwise\n // keep routing a just-deleted page's URL to its live content for longer than expected.\n const res = await fetch(`${apiUrl}/api/public/sites/${subdomain}/pages`, {\n cache: 'no-store',\n })\n if (!res.ok) return []\n const { pages } = (await res.json()) as { pages: SitePage[] }\n return pages\n } catch {\n return []\n }\n}\n\nexport type PageRewriteDecision = { path: string } | null\n\n// Middleware decision logic: given the current pathname and the site's page list, decide\n// whether to rewrite to the deleted-page placeholder or to a renamed physical page's real\n// file location. Callers still own the `_next`/`api`/static-file early-return and the actual\n// `NextResponse.rewrite` call, since those are Next.js-specific.\nexport function resolvePageRewrite(pathname: string, pages: SitePage[]): PageRewriteDecision {\n const current = pages.find((page) => page.path === pathname)\n\n if (current) {\n if (current.is_deleted) return { path: `${DELETED_PAGE_PREFIX}${pathname}` }\n // Renamed physical page: the file still lives at original_path, so rewrite there\n // internally while the browser keeps showing the new canonical path.\n if (current.is_physical && current.original_path && current.original_path !== current.path) {\n return { path: current.original_path }\n }\n return null\n }\n\n // Old URL of a renamed physical page — no redirect, it just no longer resolves to\n // anything (whether or not the page has since also been deleted).\n const oldUrlOfRenamed = pages.find(\n (page) => page.is_physical && page.original_path === pathname && page.path !== pathname,\n )\n if (oldUrlOfRenamed) return { path: `${DELETED_PAGE_PREFIX}${pathname}` }\n\n return null\n}\n\nexport type SitePageResolution =\n | { kind: 'not-found' }\n | { kind: 'duplicate'; sourceSegment: string; page: SitePage }\n | { kind: 'blank'; page: SitePage }\n\n// Catch-all route lookup: given the route's path segments, resolve which page (if any) this\n// request maps to. Callers still own the dynamic `import()` for `kind: 'duplicate'` — that\n// needs a literal relative path per app for webpack's static context analysis to work, so it\n// can't live in this shared package (see the comment at the call site).\nexport async function resolveSitePage(segments: string[], subdomainOverride?: string): Promise<SitePageResolution> {\n if (`/${segments[0]}` === DELETED_PAGE_PREFIX) return { kind: 'not-found' }\n\n const path = `/${segments.join('/')}`\n const pages = await fetchSitePages(subdomainOverride)\n const page = pages.find((entry) => entry.path === path && !entry.is_deleted)\n if (!page) return { kind: 'not-found' }\n\n if (page.duplicated_from) {\n const sourceSegment = page.duplicated_from === '/' ? '' : page.duplicated_from.replace(/^\\//, '')\n return { kind: 'duplicate', sourceSegment, page }\n }\n\n return { kind: 'blank', page }\n}\n","import { NextRequest, NextResponse } from 'next/server'\nimport { fetchSitePages, resolvePageRewrite, resolveSubdomain } from './site-pages'\n\n// Drop-in Next.js middleware for the OHH-670 page-CRUD system: rewrites deleted/renamed\n// pages to the right place before the catch-all route (see `resolveSitePage`) ever runs.\n// Apps that need extra middleware logic of their own can still compose `fetchSitePages`/\n// `resolvePageRewrite` directly instead of using this wrapper.\nexport async function sitePagesMiddleware(request: NextRequest): Promise<NextResponse> {\n const { pathname } = request.nextUrl\n\n if (pathname.startsWith('/_next') || pathname.startsWith('/api') || /\\.[a-zA-Z0-9]+$/.test(pathname)) {\n return NextResponse.next()\n }\n\n // `?subdomain=` is the canvas editor iframe's override (its own origin isn't the site's\n // real domain). Every other request — every real visitor — hits the site's actual\n // `*.ohhwells.site`/custom domain, so the request's own hostname is the source of truth\n // there; without this fallback the middleware silently no-ops on every production request.\n const subdomain =\n request.nextUrl.searchParams.get('subdomain') || resolveSubdomain(request.nextUrl.hostname)\n const pages = await fetchSitePages(subdomain || undefined)\n if (pages.length === 0) return NextResponse.next()\n\n const decision = resolvePageRewrite(pathname, pages)\n if (!decision) return NextResponse.next()\n return NextResponse.rewrite(new URL(decision.path, request.url))\n}\n\n// Mirrors the `_next`/`api` early-return above so apps that re-export this directly as\n// their middleware `config` don't invoke the function needlessly on asset requests.\nexport const sitePagesMiddlewareConfig = {\n matcher: ['/((?!_next|api).*)'],\n}\n","import { headers } from 'next/headers'\nimport { notFound } from 'next/navigation'\nimport { createElement, type ComponentType, type ReactElement } from 'react'\nimport { resolveSitePage, resolveSubdomain, type SitePage } from './site-pages'\n\nexport interface CatchAllPageHandlers {\n // Called for a page that's a duplicate of another. Must contain the actual `import(...)`\n // call itself (relative, not the `@` alias) — webpack can only build a static context\n // module (bundling every matching src/app/*/page.tsx) when the prefix is a real relative\n // path, so this one expression has to stay in the calling app's own file, resolved against\n // its own src/app tree, not this shared package's. Everything else about turning the\n // resolved module into a rendered element lives here instead.\n renderDuplicate: (sourceSegment: string) => Promise<{ default: ComponentType }>\n // Called for a page with no section content of its own yet.\n renderBlank: (page: SitePage) => ReactElement\n}\n\n// Full catch-all route resolution for the OHH-670 page-CRUD system: looks the page up,\n// calls `notFound()` for anything unresolved, and delegates to the two things every\n// consuming app still owns (the duplicate-source import and its blank-page chrome).\nexport async function renderCatchAllPage(\n segments: string[],\n subdomainOverride: string | undefined,\n handlers: CatchAllPageHandlers,\n): Promise<ReactElement> {\n // `subdomainOverride` is the canvas editor iframe's `?subdomain=` query param — its own\n // origin isn't the site's real domain. Every real visitor hits the site's actual\n // `*.ohhwells.site`/custom domain, so fall back to the request's own Host header there,\n // mirroring `sitePagesMiddleware`'s hostname fallback.\n const host = (await headers()).get('host') ?? undefined\n const subdomain = subdomainOverride || resolveSubdomain(host) || undefined\n const result = await resolveSitePage(segments, subdomain)\n\n if (result.kind === 'not-found') notFound()\n\n if (result.kind === 'duplicate') {\n try {\n const sourceModule = await handlers.renderDuplicate(result.sourceSegment)\n return createElement(sourceModule.default)\n } catch {\n notFound()\n }\n }\n\n return handlers.renderBlank(result.page)\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/site-pages.ts","../src/lib/site-pages-middleware.ts","../src/lib/site-pages-render.ts"],"sourcesContent":["// Shared page-CRUD infra (OHH-670): fetching a site's page list and deciding how the\n// catch-all route / middleware should handle deleted, renamed, and duplicated pages.\n// Server-safe (no React/browser APIs) so it can run in middleware (Edge runtime) and\n// Server Components — kept out of the main client-bundled entry point, see `../pages.ts`.\n\n// Prefix used to route deleted-physical-page requests into the catch-all `[...page]`\n// route, which has no file of its own at that segment and calls notFound() for it.\nexport const DELETED_PAGE_PREFIX = '/__ohw-deleted'\n\nexport type SitePage = {\n id: string\n path: string\n title: string\n is_physical: boolean\n original_path: string | null\n duplicated_from: string | null\n is_deleted: boolean\n}\n\n// Mirrors OhhwellsBridge's client-side resolveSubdomain: prefer the real request hostname\n// (window.location isn't available on the server, so callers pass the Host header/nextUrl\n// hostname instead) and only fall back to the NEXT_PUBLIC_SITE_URL env var when no hostname\n// is known — the only case that's true in local dev, where the host is just localhost.\nexport function resolveSubdomain(hostnameOverride?: string): string {\n if (hostnameOverride) {\n const parts = hostnameOverride.split('.')\n if (parts.length >= 3 && parts[0] !== 'www') return parts[0]\n }\n\n const siteUrl = process.env.NEXT_PUBLIC_SITE_URL\n if (!siteUrl) return ''\n try {\n const parts = new URL(siteUrl).hostname.split('.')\n if (parts.length >= 3 && parts[0] !== 'www') return parts[0]\n } catch {\n // ignore malformed env value\n }\n return ''\n}\n\n// `subdomainOverride` is the `?subdomain=` query param the canvas editor's iframe appends\n// (see `editUrl` in fo-class-experience). It's required locally: NEXT_PUBLIC_SITE_URL is\n// `http://localhost:3000` in dev, which resolveSubdomain() can't parse a subdomain from.\nexport async function fetchSitePages(subdomainOverride?: string): Promise<SitePage[]> {\n const subdomain = subdomainOverride || resolveSubdomain()\n const apiUrl = process.env.NEXT_PUBLIC_FLOWOPS_API_URL\n if (!subdomain || !apiUrl) return []\n\n try {\n // no-store, not a timed revalidate: middleware uses this list to decide whether a\n // path is deleted/renamed, and `next start`'s persistent Data Cache would otherwise\n // keep routing a just-deleted page's URL to its live content for longer than expected.\n const res = await fetch(`${apiUrl}/api/public/sites/${subdomain}/pages`, {\n cache: 'no-store',\n })\n if (!res.ok) return []\n const { pages } = (await res.json()) as { pages?: SitePage[] }\n\n // A reply without a list is not a list of none — the endpoint answers 200 with an empty body\n // when its own lookup failed. Handing that straight back put `undefined` into middleware and\n // took the whole site down with a 500 on every request.\n return pages ?? []\n } catch {\n return []\n }\n}\n\nexport type PageRewriteDecision = { path: string } | null\n\n// Middleware decision logic: given the current pathname and the site's page list, decide\n// whether to rewrite to the deleted-page placeholder or to a renamed physical page's real\n// file location. Callers still own the `_next`/`api`/static-file early-return and the actual\n// `NextResponse.rewrite` call, since those are Next.js-specific.\nexport function resolvePageRewrite(pathname: string, pages: SitePage[]): PageRewriteDecision {\n const current = pages.find((page) => page.path === pathname)\n\n if (current) {\n if (current.is_deleted) return { path: `${DELETED_PAGE_PREFIX}${pathname}` }\n // Renamed physical page: the file still lives at original_path, so rewrite there\n // internally while the browser keeps showing the new canonical path.\n if (current.is_physical && current.original_path && current.original_path !== current.path) {\n return { path: current.original_path }\n }\n return null\n }\n\n // Old URL of a renamed physical page — no redirect, it just no longer resolves to\n // anything (whether or not the page has since also been deleted).\n const oldUrlOfRenamed = pages.find(\n (page) => page.is_physical && page.original_path === pathname && page.path !== pathname,\n )\n if (oldUrlOfRenamed) return { path: `${DELETED_PAGE_PREFIX}${pathname}` }\n\n return null\n}\n\nexport type SitePageResolution =\n | { kind: 'not-found' }\n | { kind: 'duplicate'; sourceSegment: string; page: SitePage }\n | { kind: 'blank'; page: SitePage }\n\n// Catch-all route lookup: given the route's path segments, resolve which page (if any) this\n// request maps to. Callers still own the dynamic `import()` for `kind: 'duplicate'` — that\n// needs a literal relative path per app for webpack's static context analysis to work, so it\n// can't live in this shared package (see the comment at the call site).\nexport async function resolveSitePage(segments: string[], subdomainOverride?: string): Promise<SitePageResolution> {\n if (`/${segments[0]}` === DELETED_PAGE_PREFIX) return { kind: 'not-found' }\n\n const path = `/${segments.join('/')}`\n const pages = await fetchSitePages(subdomainOverride)\n const page = pages.find((entry) => entry.path === path && !entry.is_deleted)\n if (!page) return { kind: 'not-found' }\n\n if (page.duplicated_from) {\n const sourceSegment = page.duplicated_from === '/' ? '' : page.duplicated_from.replace(/^\\//, '')\n return { kind: 'duplicate', sourceSegment, page }\n }\n\n return { kind: 'blank', page }\n}\n","import { NextRequest, NextResponse } from 'next/server'\nimport { fetchSitePages, resolvePageRewrite, resolveSubdomain } from './site-pages'\n\n// Drop-in Next.js middleware for the OHH-670 page-CRUD system: rewrites deleted/renamed\n// pages to the right place before the catch-all route (see `resolveSitePage`) ever runs.\n// Apps that need extra middleware logic of their own can still compose `fetchSitePages`/\n// `resolvePageRewrite` directly instead of using this wrapper.\nexport async function sitePagesMiddleware(request: NextRequest): Promise<NextResponse> {\n const { pathname } = request.nextUrl\n\n if (pathname.startsWith('/_next') || pathname.startsWith('/api') || /\\.[a-zA-Z0-9]+$/.test(pathname)) {\n return NextResponse.next()\n }\n\n // `?subdomain=` is the canvas editor iframe's override (its own origin isn't the site's\n // real domain). Every other request — every real visitor — hits the site's actual\n // `*.ohhwells.site`/custom domain, so the request's own hostname is the source of truth\n // there; without this fallback the middleware silently no-ops on every production request.\n const subdomain =\n request.nextUrl.searchParams.get('subdomain') || resolveSubdomain(request.nextUrl.hostname)\n const pages = await fetchSitePages(subdomain || undefined)\n if (pages.length === 0) return NextResponse.next()\n\n const decision = resolvePageRewrite(pathname, pages)\n if (!decision) return NextResponse.next()\n return NextResponse.rewrite(new URL(decision.path, request.url))\n}\n\n// Mirrors the `_next`/`api` early-return above so apps that re-export this directly as\n// their middleware `config` don't invoke the function needlessly on asset requests.\nexport const sitePagesMiddlewareConfig = {\n matcher: ['/((?!_next|api).*)'],\n}\n","import { headers } from 'next/headers'\nimport { notFound } from 'next/navigation'\nimport { createElement, type ComponentType, type ReactElement } from 'react'\nimport { resolveSitePage, resolveSubdomain, type SitePage } from './site-pages'\n\nexport interface CatchAllPageHandlers {\n // Called for a page that's a duplicate of another. Must contain the actual `import(...)`\n // call itself (relative, not the `@` alias) — webpack can only build a static context\n // module (bundling every matching src/app/*/page.tsx) when the prefix is a real relative\n // path, so this one expression has to stay in the calling app's own file, resolved against\n // its own src/app tree, not this shared package's. Everything else about turning the\n // resolved module into a rendered element lives here instead.\n renderDuplicate: (sourceSegment: string) => Promise<{ default: ComponentType }>\n // Called for a page with no section content of its own yet.\n renderBlank: (page: SitePage) => ReactElement\n}\n\n// Full catch-all route resolution for the OHH-670 page-CRUD system: looks the page up,\n// calls `notFound()` for anything unresolved, and delegates to the two things every\n// consuming app still owns (the duplicate-source import and its blank-page chrome).\nexport async function renderCatchAllPage(\n segments: string[],\n subdomainOverride: string | undefined,\n handlers: CatchAllPageHandlers,\n): Promise<ReactElement> {\n // `subdomainOverride` is the canvas editor iframe's `?subdomain=` query param — its own\n // origin isn't the site's real domain. Every real visitor hits the site's actual\n // `*.ohhwells.site`/custom domain, so fall back to the request's own Host header there,\n // mirroring `sitePagesMiddleware`'s hostname fallback.\n const host = (await headers()).get('host') ?? undefined\n const subdomain = subdomainOverride || resolveSubdomain(host) || undefined\n const result = await resolveSitePage(segments, subdomain)\n\n if (result.kind === 'not-found') notFound()\n\n if (result.kind === 'duplicate') {\n try {\n const sourceModule = await handlers.renderDuplicate(result.sourceSegment)\n return createElement(sourceModule.default)\n } catch {\n notFound()\n }\n }\n\n return handlers.renderBlank(result.page)\n}\n"],"mappings":"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","names":[]}
|
package/dist/styles.css
CHANGED
|
@@ -109,6 +109,9 @@
|
|
|
109
109
|
:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .inset-0, :is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).inset-0 {
|
|
110
110
|
inset: calc(var(--spacing) * 0);
|
|
111
111
|
}
|
|
112
|
+
:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .inset-y-0, :is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).inset-y-0 {
|
|
113
|
+
inset-block: calc(var(--spacing) * 0);
|
|
114
|
+
}
|
|
112
115
|
:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .-top-1\.5, :is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).-top-1\.5 {
|
|
113
116
|
top: calc(var(--spacing) * -1.5);
|
|
114
117
|
}
|
|
@@ -282,6 +285,9 @@
|
|
|
282
285
|
:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .-mr-px, :is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).-mr-px {
|
|
283
286
|
margin-right: -1px;
|
|
284
287
|
}
|
|
288
|
+
:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .mr-auto, :is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).mr-auto {
|
|
289
|
+
margin-right: auto;
|
|
290
|
+
}
|
|
285
291
|
:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .mb-4, :is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).mb-4 {
|
|
286
292
|
margin-bottom: calc(var(--spacing) * 4);
|
|
287
293
|
}
|
|
@@ -344,6 +350,9 @@
|
|
|
344
350
|
:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .\!h-full, :is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).\!h-full {
|
|
345
351
|
height: 100% !important;
|
|
346
352
|
}
|
|
353
|
+
:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .h-2, :is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).h-2 {
|
|
354
|
+
height: calc(var(--spacing) * 2);
|
|
355
|
+
}
|
|
347
356
|
:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .h-4, :is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).h-4 {
|
|
348
357
|
height: calc(var(--spacing) * 4);
|
|
349
358
|
}
|
|
@@ -446,6 +455,9 @@
|
|
|
446
455
|
:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .w-\[18px\], :is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).w-\[18px\] {
|
|
447
456
|
width: 18px;
|
|
448
457
|
}
|
|
458
|
+
:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .w-\[132px\], :is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).w-\[132px\] {
|
|
459
|
+
width: 132px;
|
|
460
|
+
}
|
|
449
461
|
:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .w-\[152px\], :is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).w-\[152px\] {
|
|
450
462
|
width: 152px;
|
|
451
463
|
}
|
|
@@ -471,6 +483,9 @@
|
|
|
471
483
|
:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .max-w-\[260px\], :is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).max-w-\[260px\] {
|
|
472
484
|
max-width: 260px;
|
|
473
485
|
}
|
|
486
|
+
:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .max-w-\[400px\], :is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).max-w-\[400px\] {
|
|
487
|
+
max-width: 400px;
|
|
488
|
+
}
|
|
474
489
|
:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .max-w-\[448px\], :is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).max-w-\[448px\] {
|
|
475
490
|
max-width: 448px;
|
|
476
491
|
}
|
|
@@ -504,15 +519,24 @@
|
|
|
504
519
|
:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .min-w-\[18px\], :is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).min-w-\[18px\] {
|
|
505
520
|
min-width: 18px;
|
|
506
521
|
}
|
|
522
|
+
:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .min-w-\[40px\], :is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).min-w-\[40px\] {
|
|
523
|
+
min-width: 40px;
|
|
524
|
+
}
|
|
507
525
|
:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .min-w-\[64px\], :is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).min-w-\[64px\] {
|
|
508
526
|
min-width: 64px;
|
|
509
527
|
}
|
|
528
|
+
:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .min-w-\[76px\], :is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).min-w-\[76px\] {
|
|
529
|
+
min-width: 76px;
|
|
530
|
+
}
|
|
510
531
|
:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .min-w-\[80px\], :is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).min-w-\[80px\] {
|
|
511
532
|
min-width: 80px;
|
|
512
533
|
}
|
|
513
534
|
:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .min-w-\[110px\], :is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).min-w-\[110px\] {
|
|
514
535
|
min-width: 110px;
|
|
515
536
|
}
|
|
537
|
+
:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .min-w-\[132px\], :is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).min-w-\[132px\] {
|
|
538
|
+
min-width: 132px;
|
|
539
|
+
}
|
|
516
540
|
:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .min-w-\[152px\], :is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).min-w-\[152px\] {
|
|
517
541
|
min-width: 152px;
|
|
518
542
|
}
|
|
@@ -581,9 +605,17 @@
|
|
|
581
605
|
:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .resize, :is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).resize {
|
|
582
606
|
resize: both;
|
|
583
607
|
}
|
|
608
|
+
:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .appearance-none, :is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).appearance-none {
|
|
609
|
+
-webkit-appearance: none;
|
|
610
|
+
-moz-appearance: none;
|
|
611
|
+
appearance: none;
|
|
612
|
+
}
|
|
584
613
|
:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .grid-cols-2, :is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).grid-cols-2 {
|
|
585
614
|
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
586
615
|
}
|
|
616
|
+
:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .grid-cols-\[1fr_16px\], :is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).grid-cols-\[1fr_16px\] {
|
|
617
|
+
grid-template-columns: 1fr 16px;
|
|
618
|
+
}
|
|
587
619
|
:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .grid-cols-\[18px_1fr_16px\], :is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).grid-cols-\[18px_1fr_16px\] {
|
|
588
620
|
grid-template-columns: 18px 1fr 16px;
|
|
589
621
|
}
|
|
@@ -903,6 +935,9 @@
|
|
|
903
935
|
:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .p-4, :is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).p-4 {
|
|
904
936
|
padding: calc(var(--spacing) * 4);
|
|
905
937
|
}
|
|
938
|
+
:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .p-5, :is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).p-5 {
|
|
939
|
+
padding: calc(var(--spacing) * 5);
|
|
940
|
+
}
|
|
906
941
|
:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .p-6, :is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).p-6 {
|
|
907
942
|
padding: calc(var(--spacing) * 6);
|
|
908
943
|
}
|
|
@@ -1214,6 +1249,10 @@
|
|
|
1214
1249
|
:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .italic, :is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).italic {
|
|
1215
1250
|
font-style: italic;
|
|
1216
1251
|
}
|
|
1252
|
+
:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .tabular-nums, :is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).tabular-nums {
|
|
1253
|
+
--tw-numeric-spacing: tabular-nums;
|
|
1254
|
+
font-variant-numeric: var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);
|
|
1255
|
+
}
|
|
1217
1256
|
:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .line-through, :is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).line-through {
|
|
1218
1257
|
text-decoration-line: line-through;
|
|
1219
1258
|
}
|
|
@@ -1398,6 +1437,20 @@
|
|
|
1398
1437
|
:is(:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .placeholder\:text-muted-foreground,:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).placeholder\:text-muted-foreground)::placeholder {
|
|
1399
1438
|
color: var(--color-muted-foreground);
|
|
1400
1439
|
}
|
|
1440
|
+
:is(:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .placeholder\:text-muted-foreground\/70,:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).placeholder\:text-muted-foreground\/70)::-moz-placeholder {
|
|
1441
|
+
color: var(--color-muted-foreground);
|
|
1442
|
+
}
|
|
1443
|
+
:is(:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .placeholder\:text-muted-foreground\/70,:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).placeholder\:text-muted-foreground\/70)::placeholder {
|
|
1444
|
+
color: var(--color-muted-foreground);
|
|
1445
|
+
}
|
|
1446
|
+
@supports (color: color-mix(in lab, red, red)) {
|
|
1447
|
+
:is(:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .placeholder\:text-muted-foreground\/70,:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).placeholder\:text-muted-foreground\/70)::-moz-placeholder {
|
|
1448
|
+
color: color-mix(in oklab, var(--color-muted-foreground) 70%, transparent);
|
|
1449
|
+
}
|
|
1450
|
+
:is(:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .placeholder\:text-muted-foreground\/70,:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).placeholder\:text-muted-foreground\/70)::placeholder {
|
|
1451
|
+
color: color-mix(in oklab, var(--color-muted-foreground) 70%, transparent);
|
|
1452
|
+
}
|
|
1453
|
+
}
|
|
1401
1454
|
:is(:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .before\:pointer-events-none,:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).before\:pointer-events-none)::before {
|
|
1402
1455
|
content: var(--tw-content);
|
|
1403
1456
|
pointer-events: none;
|
|
@@ -1587,6 +1640,12 @@
|
|
|
1587
1640
|
opacity: 90%;
|
|
1588
1641
|
}
|
|
1589
1642
|
}
|
|
1643
|
+
:is(:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .focus\:border-bridge-primary,:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).focus\:border-bridge-primary):focus {
|
|
1644
|
+
border-color: var(--color-bridge-primary);
|
|
1645
|
+
}
|
|
1646
|
+
:is(:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .focus\:border-destructive,:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).focus\:border-destructive):focus {
|
|
1647
|
+
border-color: var(--color-destructive);
|
|
1648
|
+
}
|
|
1590
1649
|
:is(:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .focus\:bg-muted,:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).focus\:bg-muted):focus {
|
|
1591
1650
|
background-color: var(--color-muted);
|
|
1592
1651
|
}
|
|
@@ -1814,6 +1873,38 @@
|
|
|
1814
1873
|
:is(:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .\[\&_svg\:not\(\[class\*\=absolute\]\)\]\:relative,:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).\[\&_svg\:not\(\[class\*\=absolute\]\)\]\:relative) svg:not([class*=absolute]) {
|
|
1815
1874
|
position: relative;
|
|
1816
1875
|
}
|
|
1876
|
+
:is(:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .\[\&\:\:-moz-range-thumb\]\:size-5,:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).\[\&\:\:-moz-range-thumb\]\:size-5)::-moz-range-thumb {
|
|
1877
|
+
width: calc(var(--spacing) * 5);
|
|
1878
|
+
height: calc(var(--spacing) * 5);
|
|
1879
|
+
}
|
|
1880
|
+
:is(:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .\[\&\:\:-moz-range-thumb\]\:rounded-full,:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).\[\&\:\:-moz-range-thumb\]\:rounded-full)::-moz-range-thumb {
|
|
1881
|
+
border-radius: calc(infinity * 1px);
|
|
1882
|
+
}
|
|
1883
|
+
:is(:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .\[\&\:\:-moz-range-thumb\]\:border-2,:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).\[\&\:\:-moz-range-thumb\]\:border-2)::-moz-range-thumb {
|
|
1884
|
+
border-style: var(--tw-border-style);
|
|
1885
|
+
border-width: 2px;
|
|
1886
|
+
}
|
|
1887
|
+
:is(:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .\[\&\:\:-moz-range-thumb\]\:bg-background,:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).\[\&\:\:-moz-range-thumb\]\:bg-background)::-moz-range-thumb {
|
|
1888
|
+
background-color: var(--color-background);
|
|
1889
|
+
}
|
|
1890
|
+
:is(:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .\[\&\:\:-webkit-slider-thumb\]\:size-5,:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).\[\&\:\:-webkit-slider-thumb\]\:size-5)::-webkit-slider-thumb {
|
|
1891
|
+
width: calc(var(--spacing) * 5);
|
|
1892
|
+
height: calc(var(--spacing) * 5);
|
|
1893
|
+
}
|
|
1894
|
+
:is(:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .\[\&\:\:-webkit-slider-thumb\]\:appearance-none,:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).\[\&\:\:-webkit-slider-thumb\]\:appearance-none)::-webkit-slider-thumb {
|
|
1895
|
+
-webkit-appearance: none;
|
|
1896
|
+
appearance: none;
|
|
1897
|
+
}
|
|
1898
|
+
:is(:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .\[\&\:\:-webkit-slider-thumb\]\:rounded-full,:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).\[\&\:\:-webkit-slider-thumb\]\:rounded-full)::-webkit-slider-thumb {
|
|
1899
|
+
border-radius: calc(infinity * 1px);
|
|
1900
|
+
}
|
|
1901
|
+
:is(:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .\[\&\:\:-webkit-slider-thumb\]\:border-2,:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).\[\&\:\:-webkit-slider-thumb\]\:border-2)::-webkit-slider-thumb {
|
|
1902
|
+
border-style: var(--tw-border-style);
|
|
1903
|
+
border-width: 2px;
|
|
1904
|
+
}
|
|
1905
|
+
:is(:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .\[\&\:\:-webkit-slider-thumb\]\:bg-background,:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).\[\&\:\:-webkit-slider-thumb\]\:bg-background)::-webkit-slider-thumb {
|
|
1906
|
+
background-color: var(--color-background);
|
|
1907
|
+
}
|
|
1817
1908
|
:is(:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]) .\[\&\>svg\:first-child\]\:absolute,:is([data-ohw-bridge-root],[data-ohw-bridge],[data-radix-popper-content-wrapper],[data-slot="dropdown-menu-content"],[data-slot="popover-content"],[data-slot="tooltip-content"],[data-ohw-field-type-picker],[data-ohw-section-container="scheduling"],[data-ohw-scheduling-anchor],[data-ohw-scheduling-modal]).\[\&\>svg\:first-child\]\:absolute) > svg:first-child {
|
|
1818
1909
|
position: absolute;
|
|
1819
1910
|
}
|
|
@@ -2227,6 +2318,26 @@ html[data-ohw-section-picking] [data-ohw-state-toggle] {
|
|
|
2227
2318
|
syntax: "*";
|
|
2228
2319
|
inherits: false;
|
|
2229
2320
|
}
|
|
2321
|
+
@property --tw-ordinal {
|
|
2322
|
+
syntax: "*";
|
|
2323
|
+
inherits: false;
|
|
2324
|
+
}
|
|
2325
|
+
@property --tw-slashed-zero {
|
|
2326
|
+
syntax: "*";
|
|
2327
|
+
inherits: false;
|
|
2328
|
+
}
|
|
2329
|
+
@property --tw-numeric-figure {
|
|
2330
|
+
syntax: "*";
|
|
2331
|
+
inherits: false;
|
|
2332
|
+
}
|
|
2333
|
+
@property --tw-numeric-spacing {
|
|
2334
|
+
syntax: "*";
|
|
2335
|
+
inherits: false;
|
|
2336
|
+
}
|
|
2337
|
+
@property --tw-numeric-fraction {
|
|
2338
|
+
syntax: "*";
|
|
2339
|
+
inherits: false;
|
|
2340
|
+
}
|
|
2230
2341
|
@property --tw-shadow {
|
|
2231
2342
|
syntax: "*";
|
|
2232
2343
|
inherits: false;
|
|
@@ -2383,6 +2494,11 @@ html[data-ohw-section-picking] [data-ohw-state-toggle] {
|
|
|
2383
2494
|
--tw-leading: initial;
|
|
2384
2495
|
--tw-font-weight: initial;
|
|
2385
2496
|
--tw-tracking: initial;
|
|
2497
|
+
--tw-ordinal: initial;
|
|
2498
|
+
--tw-slashed-zero: initial;
|
|
2499
|
+
--tw-numeric-figure: initial;
|
|
2500
|
+
--tw-numeric-spacing: initial;
|
|
2501
|
+
--tw-numeric-fraction: initial;
|
|
2386
2502
|
--tw-shadow: 0 0 #0000;
|
|
2387
2503
|
--tw-shadow-color: initial;
|
|
2388
2504
|
--tw-shadow-alpha: 100%;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ohhwells/bridge",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.151-next.408",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -17,12 +17,12 @@
|
|
|
17
17
|
"import": "./dist/pages.js",
|
|
18
18
|
"require": "./dist/pages.cjs"
|
|
19
19
|
},
|
|
20
|
-
"./styles": "./dist/styles.css",
|
|
21
20
|
"./social-glyphs": {
|
|
22
21
|
"types": "./dist/social-glyphs.d.ts",
|
|
23
22
|
"import": "./dist/social-glyphs.js",
|
|
24
23
|
"require": "./dist/social-glyphs.cjs"
|
|
25
|
-
}
|
|
24
|
+
},
|
|
25
|
+
"./styles": "./dist/styles.css"
|
|
26
26
|
},
|
|
27
27
|
"files": [
|
|
28
28
|
"dist"
|