@nadicodeai/ui 12.1.114 → 12.1.116
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/dist/components/company-card/scene.d.ts.map +1 -1
- package/dist/components/company-card/scene.js +4 -1
- package/dist/components/company-card/shader.d.ts +4 -3
- package/dist/components/company-card/shader.d.ts.map +1 -1
- package/dist/components/company-card/shader.js +4 -3
- package/dist/components/resizable.d.ts +1 -1
- package/dist/components/resizable.js +1 -1
- package/dist/eslint/index.js +2 -0
- package/dist/eslint/rules/disabled-control-appearance.js +75 -0
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/internal/assistant-ui/markdown-text.js +1 -1
- package/dist/showcase/specimens/index.d.ts +0 -1
- package/dist/showcase/specimens/index.d.ts.map +1 -1
- package/dist/showcase/specimens/navigation.d.ts +0 -1
- package/dist/showcase/specimens/navigation.d.ts.map +1 -1
- package/dist/showcase/specimens/navigation.js +0 -2
- package/dist/showcase/usage.generated.d.ts +1 -1
- package/dist/showcase/usage.generated.d.ts.map +1 -1
- package/dist/showcase/usage.generated.js +1 -12
- package/package.json +15 -11
- package/dist/components/desktop-shell.d.ts +0 -45
- package/dist/components/desktop-shell.d.ts.map +0 -1
- package/dist/components/desktop-shell.js +0 -23
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scene.d.ts","sourceRoot":"","sources":["../../../src/components/company-card/scene.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"scene.d.ts","sourceRoot":"","sources":["../../../src/components/company-card/scene.ts"],"names":[],"mappings":"AACA,OAAO,EAAU,KAAK,GAAG,EAAE,KAAK,MAAM,EAAE,MAAM,MAAM,CAAC;AAMrD,qFAAqF;AACrF,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,GAAG,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,kFAAkF;IAClF,IAAI,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;CACtD,CAAC;AAEF,wBAAgB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,yBAsBvE"}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
+
import { prepareShader } from "@vgpu/wgsl/prepare";
|
|
1
2
|
import { effect } from "vgpu";
|
|
2
3
|
import { CARD_FOIL_SHADER } from "./shader.js";
|
|
4
|
+
// Prepared once and reused: vgpu revalidates a shader artifact only the first time it sees it.
|
|
5
|
+
const FOIL_SHADER = prepareShader(CARD_FOIL_SHADER, "company-card/shader.wgsl");
|
|
3
6
|
export function createScene(gpu, output, colors) {
|
|
4
7
|
const [hue0, hue1, hue2, hue3, hue4, hue5] = colors.hues;
|
|
5
|
-
const shader = effect(gpu,
|
|
8
|
+
const shader = effect(gpu, FOIL_SHADER, {
|
|
6
9
|
label: "holographic-card",
|
|
7
10
|
set: {
|
|
8
11
|
params: {
|
|
@@ -2,9 +2,10 @@
|
|
|
2
2
|
* The holographic foil's fragment shader, as a string.
|
|
3
3
|
*
|
|
4
4
|
* This package builds with tsc alone, so a `.wgsl` file would neither be
|
|
5
|
-
* emitted into `dist` nor compiled by a consumer's bundler.
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* emitted into `dist` nor compiled by a consumer's bundler. The shader travels
|
|
6
|
+
* as the module below, and the scene prepares it with `@vgpu/wgsl`'s
|
|
7
|
+
* `prepareShader`, the runtime form of what vgpu's bundler loaders do, so it
|
|
8
|
+
* needs no loader in any host.
|
|
8
9
|
*/
|
|
9
10
|
export declare const CARD_FOIL_SHADER = "\n// nadicode: vgpu's holographic card (MIT, https://github.com/vercel-labs/vgpu,\n// examples/holographic-card, revision 6fa27bb4). Its light model is unchanged.\n// The surface is the company card itself, 85.6 x 54 mm, which the page tilts;\n// vgpu's triangle, fractal and lettering give way to the card's own marks; and\n// every colour is a design-system token: the spectrum and the pearl fall in\n// pure bands of the identity hues, never a colour between two of them.\nstruct Params {\n resolution: vec2f,\n tilt: vec2f,\n pointer: vec2f,\n hover: f32,\n graphite: vec3f,\n ink: vec3f,\n hue0: vec3f,\n hue1: vec3f,\n hue2: vec3f,\n hue3: vec3f,\n hue4: vec3f,\n hue5: vec3f,\n}\n@group(0) @binding(0) var<uniform> params: Params;\n\nconst HALF = vec2f(0.856, 0.54);\nconst ROSETTE = vec2f(0.448, -0.016);\n\nfn stroke(distance: f32, width: f32, aa: f32) -> f32 {\n return 1.0 - smoothstep(width, width + aa, abs(distance));\n}\n\n// The identity hues in spectral order, each a band of its own: a blend of two\n// neighbours is a colour the palette does not have.\nfn palette(t: f32) -> vec3f {\n let hues = array<vec3f, 6>(params.hue0, params.hue1, params.hue2, params.hue3, params.hue4, params.hue5);\n return hues[min(u32(clamp(t, 0.0, 1.0) * 6.0), 5u)];\n}\n\n// vgpu's visible-light window, drawn with the identity band instead of display RGB.\nfn wavelengthColor(wavelength: f32) -> vec3f {\n let visible = smoothstep(0.380, 0.410, wavelength) * (1.0 - smoothstep(0.700, 0.780, wavelength));\n return palette((wavelength - 0.44) / 0.22) * visible * 0.8;\n}\n\n// Reflection grating approximation: m * wavelength = d * dot(L + V, across).\n// L and V point away from the surface; across is perpendicular to the grooves.\n// Based on the diffraction-order model in GPU Gems, chapter 8 (Jos Stam).\nfn diffraction(across: vec2f, lightAndView: vec2f, spacing: f32) -> vec3f {\n let pathDifference = spacing * abs(dot(lightAndView, across));\n let along = dot(lightAndView, vec2f(-across.y, across.x));\n // Finite, imperfect groove patches broaden the directional reflection.\n let envelope = exp(-along * along / 0.36);\n var reflected = vec3f(0);\n for (var order = 1; order <= 3; order++) {\n let m = f32(order);\n reflected += wavelengthColor(pathDifference / m) / (m * m);\n }\n return reflected * envelope;\n}\n\n// Broad pearlescence underneath the finer diffraction detail, in the same hues.\nfn pearlColor(phase: f32) -> vec3f {\n let cycle = abs(fract(phase * 0.5) * 2.0 - 1.0);\n return mix(palette(cycle), vec3f(0.82), 0.35);\n}\n\nfn grain(point: vec2f) -> f32 {\n let p = vec2u(abs(point) * 2400.0);\n var n = (p.x * 1597334677u) ^ (p.y * 3812015801u);\n n = (n ^ (n >> 16u)) * 2246822519u;\n return f32(n & 1023u) / 1023.0 - 0.5;\n}\n\nfn etchedPhase(p: vec2f) -> f32 {\n // Warp the surface before tracing contours, so their spacing flows in soft waves.\n let warp = vec2f(\n sin(p.y * 7.0 + sin(p.x * 4.0)) * 0.085,\n sin(p.x * 6.0 - p.y * 3.0) * 0.07\n );\n let q = p + warp - ROSETTE;\n let radius = length(q * vec2f(1.0, 0.86));\n return radius * 142.0 + sin(atan2(q.y, q.x) * 3.0 + radius * 8.0) * 1.7;\n}\n\n@fragment\nfn fs_main(@location(0) uv: vec2f) -> @location(0) vec4f {\n let p = (uv - 0.5) * 2.0 * HALF;\n let sx = sin(params.tilt.y);\n let cx = cos(params.tilt.y);\n let sy = sin(params.tilt.x);\n let cy = cos(params.tilt.x);\n let right = vec3f(cy, 0, -sy);\n let down = vec3f(sy * sx, cx, cy * sx);\n let normal = cross(right, down);\n let eye = vec3f(0, 0, 4.5);\n let hit = right * p.x + down * p.y;\n let aa = max(length(fwidth(p)), 0.0006);\n\n // Matte graphite remains dark; only the cursor's grazing light reveals the foil.\n let hover = clamp(params.hover, 0.0, 1.0);\n let lightCenter = params.pointer * HALF;\n let delta = p - lightCenter;\n let sweepDistance = delta.x * 0.72 + delta.y * 0.52 + sin(p.y * 4.0 + p.x * 3.0) * 0.08;\n let bandDistance = sweepDistance / 0.36;\n let lightBand = exp(-bandDistance * bandDistance);\n let glintDistance = sweepDistance / 0.085;\n let glint = exp(-glintDistance * glintDistance);\n let spotlight = exp(-dot(delta * vec2f(0.9, 1.1), delta * vec2f(0.9, 1.1)) * 2.6);\n let light = lightBand * spotlight * hover;\n let lightDirection = normalize(vec3f(lightCenter, 1.2) - hit);\n let viewDirection = normalize(eye - hit);\n let lightAndView = vec2f(dot(lightDirection + viewDirection, right), dot(lightDirection + viewDirection, down));\n let illumination = max(dot(normal, lightDirection), 0.0) * max(dot(normal, viewDirection), 0.0);\n let tint = params.ink * 0.78;\n let noise = grain(p + vec2f(2));\n var color = params.graphite + 0.008 * (0.9 - p.y);\n // Fine, surface-locked grain catches the grazing reflection without animated static.\n color += noise * (0.022 + light * 0.085);\n color += light * (vec3f(0.045) + tint * 0.065);\n\n // One engraving over the whole card, where vgpu keeps a triangle and a fractal.\n let contour = etchedPhase(p);\n // Transform screen derivatives back into the card plane: microscopic grooves\n // follow the visible contours, but their 1.65um spacing is independent of zoom.\n let dx = dpdx(p);\n let dy = dpdy(p);\n let gradient = vec2f(dpdx(contour) * dy.y - dpdy(contour) * dx.y, dpdy(contour) * dx.x - dpdx(contour) * dy.x);\n let across = gradient / max(length(gradient), 0.00000001);\n let foilDiffraction = diffraction(across, lightAndView, 1.65) * illumination;\n let contours = stroke(sin(contour), 0.06, min(fwidth(contour), 1.0));\n let reveal = hover * (0.06 + 0.24 * spotlight + light * 1.15);\n let pearlPhase = dot(lightAndView, vec2f(0.48, -0.32)) + p.y * 0.32 + contour * 0.003;\n let pearl = pearlColor(pearlPhase);\n color += pearl * light * 0.24;\n color += (pearl * 0.5 + vec3f(0.5)) * glint * spotlight * hover * 0.12;\n let sparkle = pow(max(noise + 0.5, 0.0), 24.0) * glint * spotlight * hover;\n color += pearl * sparkle * 0.22;\n let foil = vec3f(0.12, 0.14, 0.18) + pearl * 0.65 + foilDiffraction * 0.12;\n color += contours * 0.65 * foil * reveal;\n\n // A delicate spectral echo stays clipped to the same engraving.\n let foilPoint = p - (vec2f(0.007, -0.004) + params.tilt * 0.012);\n let foilPhase = etchedPhase(foilPoint);\n let foilLines = stroke(sin(foilPhase), 0.025, min(fwidth(foilPhase), 1.0));\n color += foilLines * 0.65 * (pearl + foilDiffraction * 0.2) * reveal * 0.22;\n\n // Sparse microdots and registration ticks emerge in the foil.\n let grid = (fract((p + 1.0) * 20.0) - 0.5) / 20.0;\n let dots = stroke(length(grid), 0.0008, aa * 0.4);\n color += dots * reveal * 0.17;\n let guide = abs(p) - (HALF - vec2f(0.07, 0.07));\n let horizontal = stroke(guide.y, 0.0006, aa * 0.5) * (1.0 - smoothstep(0.012, 0.017, abs(guide.x)));\n let vertical = stroke(guide.x, 0.0006, aa * 0.5) * (1.0 - smoothstep(0.012, 0.017, abs(guide.y)));\n color += max(horizontal, vertical) * hover * (0.12 + light * 0.22);\n\n return vec4f(color, 1);\n}\n";
|
|
10
11
|
//# sourceMappingURL=shader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shader.d.ts","sourceRoot":"","sources":["../../../src/components/company-card/shader.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"shader.d.ts","sourceRoot":"","sources":["../../../src/components/company-card/shader.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,u3NA4J5B,CAAC"}
|
|
@@ -2,9 +2,10 @@
|
|
|
2
2
|
* The holographic foil's fragment shader, as a string.
|
|
3
3
|
*
|
|
4
4
|
* This package builds with tsc alone, so a `.wgsl` file would neither be
|
|
5
|
-
* emitted into `dist` nor compiled by a consumer's bundler.
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* emitted into `dist` nor compiled by a consumer's bundler. The shader travels
|
|
6
|
+
* as the module below, and the scene prepares it with `@vgpu/wgsl`'s
|
|
7
|
+
* `prepareShader`, the runtime form of what vgpu's bundler loaders do, so it
|
|
8
|
+
* needs no loader in any host.
|
|
8
9
|
*/
|
|
9
10
|
export const CARD_FOIL_SHADER = /* wgsl */ `
|
|
10
11
|
// nadicode: vgpu's holographic card (MIT, https://github.com/vercel-labs/vgpu,
|
|
@@ -4,7 +4,7 @@ import * as ResizablePrimitive from "react-resizable-panels";
|
|
|
4
4
|
*
|
|
5
5
|
* @family Other
|
|
6
6
|
* @when Side-by-side panes whose balance a person sets: a conversation and its side panel. Nadia's side panel is this, with the window's grid column as the group; it is not a hand-made separator.
|
|
7
|
-
* @instead The product frame's sidebar resizes through `Sidebar`'s `resize` handle
|
|
7
|
+
* @instead The product frame's sidebar resizes through `Sidebar`'s `resize` handle. A width a person never changes is a plain grid column. A window too narrow for the panes side by side gets a compact alternative, one pane at a time, instead of squeezed panes.
|
|
8
8
|
* @behaviour The handle moves on drag and on arrow keys, and returns the panels to their default size on a double click; each panel keeps its minimum, set where its content still reads, and its maximum. A number is pixels (`minSize={352}`), a string without a unit is a percentage (`defaultSize="60"`), and `"20rem"` and `"40vw"` are read as written, so a panel that must keep a readable width is set in pixels and the pane beside it takes the rest. The handle is a 1 px line with a 4 px wide hit area centred on it; it takes the ring colour while hovered, dragged or focused, and `withHandle` adds a grip for a handle that must be found. Colour: neutral until it is touched, then the ring colour, and nothing else. The group holds sizes only while it is mounted; the product owns persisting them.
|
|
9
9
|
* @words Required: the handle's name, a verb phrase from the product's catalogue: *Resize the side panel*. A panel has none of its own.
|
|
10
10
|
* @access The handle is the resizable library's focusable `separator` with its value, named by the `aria-label` the type requires; the arrow keys move it and Home and End take it to the ends of its range.
|
|
@@ -7,7 +7,7 @@ import { cn } from "../lib/utils.js";
|
|
|
7
7
|
*
|
|
8
8
|
* @family Other
|
|
9
9
|
* @when Side-by-side panes whose balance a person sets: a conversation and its side panel. Nadia's side panel is this, with the window's grid column as the group; it is not a hand-made separator.
|
|
10
|
-
* @instead The product frame's sidebar resizes through `Sidebar`'s `resize` handle
|
|
10
|
+
* @instead The product frame's sidebar resizes through `Sidebar`'s `resize` handle. A width a person never changes is a plain grid column. A window too narrow for the panes side by side gets a compact alternative, one pane at a time, instead of squeezed panes.
|
|
11
11
|
* @behaviour The handle moves on drag and on arrow keys, and returns the panels to their default size on a double click; each panel keeps its minimum, set where its content still reads, and its maximum. A number is pixels (`minSize={352}`), a string without a unit is a percentage (`defaultSize="60"`), and `"20rem"` and `"40vw"` are read as written, so a panel that must keep a readable width is set in pixels and the pane beside it takes the rest. The handle is a 1 px line with a 4 px wide hit area centred on it; it takes the ring colour while hovered, dragged or focused, and `withHandle` adds a grip for a handle that must be found. Colour: neutral until it is touched, then the ring colour, and nothing else. The group holds sizes only while it is mounted; the product owns persisting them.
|
|
12
12
|
* @words Required: the handle's name, a verb phrase from the product's catalogue: *Resize the side panel*. A panel has none of its own.
|
|
13
13
|
* @access The handle is the resizable library's focusable `separator` with its value, named by the `aria-label` the type requires; the arrow keys move it and Home and End take it to the ends of its range.
|
package/dist/eslint/index.js
CHANGED
|
@@ -15,6 +15,7 @@ import { confirmDialogWords } from "./rules/confirm-dialog-words.js";
|
|
|
15
15
|
import { dataTableOneUnsizedColumn } from "./rules/data-table-one-unsized-column.js";
|
|
16
16
|
import { destructiveActionPlacement } from "./rules/destructive-action-placement.js";
|
|
17
17
|
import { disabledChoiceSaysWhy } from "./rules/disabled-choice-says-why.js";
|
|
18
|
+
import { disabledControlAppearance } from "./rules/disabled-control-appearance.js";
|
|
18
19
|
import { settingsLimitInFooter } from "./rules/settings-limit-in-footer.js";
|
|
19
20
|
import { ellipsisOpensADialog } from "./rules/ellipsis-opens-a-dialog.js";
|
|
20
21
|
import { emptyStateOwner } from "./rules/empty-state-owner.js";
|
|
@@ -160,6 +161,7 @@ const plugin = {
|
|
|
160
161
|
"data-table-one-unsized-column": dataTableOneUnsizedColumn,
|
|
161
162
|
"destructive-action-placement": destructiveActionPlacement,
|
|
162
163
|
"disabled-choice-says-why": disabledChoiceSaysWhy,
|
|
164
|
+
"disabled-control-appearance": disabledControlAppearance,
|
|
163
165
|
"settings-limit-in-footer": settingsLimitInFooter,
|
|
164
166
|
"ellipsis-opens-a-dialog": ellipsisOpensADialog,
|
|
165
167
|
"empty-state-owner": emptyStateOwner,
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Standard tool checked first: a `no-restricted-syntax` selector can match a
|
|
3
|
+
* conditional `variant`, but not that its condition reads a value the same
|
|
4
|
+
* element's `disabled` reads. That needs the two expressions compared.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { walk } from "./rendered-import.js";
|
|
8
|
+
|
|
9
|
+
const APPEARANCE_ATTRIBUTES = ["variant", "triggerVariant", "size"];
|
|
10
|
+
|
|
11
|
+
function valuePathsAndPrefixes(root, sourceCode) {
|
|
12
|
+
const names = new Set();
|
|
13
|
+
const collect = (node) => {
|
|
14
|
+
const pathTail = node.parent?.type === "MemberExpression" && !node.parent.computed;
|
|
15
|
+
if (node.type === "Identifier" && !pathTail) names.add(node.name);
|
|
16
|
+
if (node.type === "MemberExpression" && !node.computed) names.add(sourceCode.getText(node));
|
|
17
|
+
};
|
|
18
|
+
collect(root);
|
|
19
|
+
walk(root, sourceCode.visitorKeys, collect);
|
|
20
|
+
return names;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const attribute = (openingElement, name) =>
|
|
24
|
+
openingElement.attributes.find(
|
|
25
|
+
(candidate) => candidate.type === "JSXAttribute" && candidate.name.name === name,
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
export const disabledControlAppearance = {
|
|
29
|
+
meta: {
|
|
30
|
+
type: "problem",
|
|
31
|
+
docs: {
|
|
32
|
+
description:
|
|
33
|
+
"A control never chooses its variant from the condition that disables it, so a disabled control has one appearance.",
|
|
34
|
+
},
|
|
35
|
+
schema: [
|
|
36
|
+
{
|
|
37
|
+
type: "object",
|
|
38
|
+
properties: {
|
|
39
|
+
controls: { type: "array", items: { type: "string" }, uniqueItems: true },
|
|
40
|
+
},
|
|
41
|
+
additionalProperties: false,
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
defaultOptions: [{ controls: ["Button"] }],
|
|
45
|
+
messages: {
|
|
46
|
+
"variant-follows-disabled":
|
|
47
|
+
"{{control}} turns its {{attribute}} on `{{condition}}`, which also disables it, so its disabled state looks unlike every other disabled {{control}}. Keep one {{attribute}} and let `disabled` draw the state.",
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
create(context) {
|
|
51
|
+
const [{ controls }] = context.options;
|
|
52
|
+
const { sourceCode } = context;
|
|
53
|
+
return {
|
|
54
|
+
JSXOpeningElement(node) {
|
|
55
|
+
if (node.name.type !== "JSXIdentifier" || !controls.includes(node.name.name)) return;
|
|
56
|
+
const disabled = attribute(node, "disabled")?.value;
|
|
57
|
+
if (disabled?.type !== "JSXExpressionContainer") return;
|
|
58
|
+
const disabling = valuePathsAndPrefixes(disabled.expression, sourceCode);
|
|
59
|
+
for (const name of APPEARANCE_ATTRIBUTES) {
|
|
60
|
+
const chosen = attribute(node, name)?.value;
|
|
61
|
+
if (chosen?.type !== "JSXExpressionContainer") continue;
|
|
62
|
+
if (chosen.expression.type !== "ConditionalExpression") continue;
|
|
63
|
+
const { test } = chosen.expression;
|
|
64
|
+
if (![...valuePathsAndPrefixes(test, sourceCode)].some((read) => disabling.has(read)))
|
|
65
|
+
continue;
|
|
66
|
+
context.report({
|
|
67
|
+
node: chosen,
|
|
68
|
+
messageId: "variant-follows-disabled",
|
|
69
|
+
data: { control: node.name.name, attribute: name, condition: sourceCode.getText(test) },
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
},
|
|
75
|
+
};
|
package/dist/index.d.ts
CHANGED
|
@@ -51,7 +51,6 @@ export * from "./components/confirm-dialog.js";
|
|
|
51
51
|
export * from "./components/context-menu.js";
|
|
52
52
|
export * from "./components/copy-button.js";
|
|
53
53
|
export * from "./components/data-table.js";
|
|
54
|
-
export * from "./components/desktop-shell.js";
|
|
55
54
|
export * from "./components/dialog.js";
|
|
56
55
|
export * from "./components/diff-count.js";
|
|
57
56
|
export * from "./components/disclosure.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oBAAoB,CAAC;AACnC,cAAc,iCAAiC,CAAC;AAChD,cAAc,mCAAmC,CAAC;AAClD,cAAc,iCAAiC,CAAC;AAChD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yBAAyB,CAAC;AACxC,cAAc,uCAAuC,CAAC;AACtD,cAAc,kCAAkC,CAAC;AACjD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,iCAAiC,CAAC;AAChD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -51,7 +51,6 @@ export * from "./components/confirm-dialog.js";
|
|
|
51
51
|
export * from "./components/context-menu.js";
|
|
52
52
|
export * from "./components/copy-button.js";
|
|
53
53
|
export * from "./components/data-table.js";
|
|
54
|
-
export * from "./components/desktop-shell.js";
|
|
55
54
|
export * from "./components/dialog.js";
|
|
56
55
|
export * from "./components/diff-count.js";
|
|
57
56
|
export * from "./components/disclosure.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { MarkdownTextPrimitive,
|
|
3
|
+
import { MarkdownTextPrimitive, memoizeMarkdownComponents, useIsMarkdownCodeBlock, } from "@assistant-ui/react-markdown";
|
|
4
4
|
import remarkGfm from "remark-gfm";
|
|
5
5
|
import { memo } from "react";
|
|
6
6
|
import { CheckIcon, CopyIcon } from "lucide-react";
|
|
@@ -82,7 +82,6 @@ export declare const SPECIMENS: {
|
|
|
82
82
|
AgentListRow: () => import("react").JSX.Element;
|
|
83
83
|
Breadcrumb: () => import("react").JSX.Element;
|
|
84
84
|
CommandDialog: () => import("react").JSX.Element;
|
|
85
|
-
DesktopAppShell: () => import("react").JSX.Element;
|
|
86
85
|
Footer: () => import("react").JSX.Element;
|
|
87
86
|
PortalSidebarFrame: () => import("react").JSX.Element;
|
|
88
87
|
ScopeSwitcher: () => import("react").JSX.Element;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/showcase/specimens/index.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,SAAS
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/showcase/specimens/index.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAYiB,CAAC"}
|
|
@@ -6,7 +6,6 @@ export declare const NAVIGATION: {
|
|
|
6
6
|
AgentListRow: () => import("react").JSX.Element;
|
|
7
7
|
Breadcrumb: () => import("react").JSX.Element;
|
|
8
8
|
CommandDialog: typeof CommandDialogSpecimen;
|
|
9
|
-
DesktopAppShell: () => import("react").JSX.Element;
|
|
10
9
|
Footer: () => import("react").JSX.Element;
|
|
11
10
|
PortalSidebarFrame: () => import("react").JSX.Element;
|
|
12
11
|
ScopeSwitcher: typeof ScopeSwitcherSpecimen;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../../src/showcase/specimens/navigation.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../../src/showcase/specimens/navigation.tsx"],"names":[],"mappings":"AAoEA,iBAAS,qBAAqB,gCAoC7B;AAED,iBAAS,qBAAqB,gCAmB7B;AAED,iBAAS,uBAAuB,gCAiE/B;AAED,iBAAS,YAAY,gCAqCpB;AAED,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;CAmRI,CAAC"}
|
|
@@ -8,7 +8,6 @@ import { BrandWordmark } from "../../components/brand.js";
|
|
|
8
8
|
import { Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, } from "../../components/breadcrumb.js";
|
|
9
9
|
import { Button } from "../../components/button.js";
|
|
10
10
|
import { CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandShortcut, } from "../../components/command.js";
|
|
11
|
-
import { DesktopAppShell } from "../../components/desktop-shell.js";
|
|
12
11
|
import { Footer, FooterBrand, FooterIdentity, FooterInner, FooterMeta, FooterNav, } from "../../components/footer.js";
|
|
13
12
|
import { AgentIcon, ApprovalsIcon } from "../../components/house-icons.js";
|
|
14
13
|
import { Kbd } from "../../components/kbd.js";
|
|
@@ -90,7 +89,6 @@ export const NAVIGATION = {
|
|
|
90
89
|
AgentListRow: () => (_jsxs("ul", { className: "grid max-w-xs gap-1", children: [_jsx("li", { children: _jsx(AgentListRow, { color: COBALTO, current: true, form: "orbit", name: "Invoices", state: "working", stateLine: "Drafting October's invoices" }) }), _jsx("li", { children: _jsx(AgentListRow, { color: VERDE, form: "lattice", name: "Orders", state: "waiting", stateLine: "Waiting for you", stateTone: "warn" }) })] })),
|
|
91
90
|
Breadcrumb: () => (_jsxs("div", { className: "grid gap-4", children: [_jsx(Breadcrumb, { "aria-label": "Path", children: _jsxs(BreadcrumbList, { children: [_jsx(BreadcrumbItem, { children: _jsx(BreadcrumbLink, { href: "#customers", children: "Customers" }) }), _jsx(BreadcrumbSeparator, {}), _jsx(BreadcrumbItem, { children: _jsx(BreadcrumbPage, { children: "Rossi Ottica" }) })] }) }), _jsx(Breadcrumb, { "aria-label": "Path with a closed ancestor", children: _jsxs(BreadcrumbList, { children: [_jsx(BreadcrumbItem, { children: _jsx(BreadcrumbLink, { disabled: true, children: "Partners" }) }), _jsx(BreadcrumbSeparator, {}), _jsx(BreadcrumbItem, { children: _jsx(BreadcrumbLink, { href: "#customers", children: "Customers" }) }), _jsx(BreadcrumbSeparator, {}), _jsx(BreadcrumbItem, { children: _jsx(BreadcrumbPage, { children: "Rossi Ottica" }) })] }) }), _jsx(Breadcrumb, { "aria-label": "Long path", children: _jsxs(BreadcrumbList, { children: [_jsx(BreadcrumbItem, { children: _jsx(BreadcrumbLink, { href: "#customers", children: "Customers" }) }), _jsx(BreadcrumbSeparator, {}), _jsx(BreadcrumbItem, { children: _jsx(BreadcrumbEllipsis, { label: "More" }) }), _jsx(BreadcrumbSeparator, {}), _jsx(BreadcrumbItem, { children: _jsx(BreadcrumbLink, { href: "#installations", children: "Installations" }) }), _jsx(BreadcrumbSeparator, {}), _jsx(BreadcrumbItem, { children: _jsx(BreadcrumbPage, { children: "Rossi Ottica, Milano" }) })] }) })] })),
|
|
92
91
|
CommandDialog: CommandDialogSpecimen,
|
|
93
|
-
DesktopAppShell: () => (_jsx("div", { className: "h-96 overflow-hidden rounded-md border border-border", children: _jsx(DesktopAppShell, { activityRail: _jsx(Navigation, { children: _jsx(SidebarMenu, { className: "p-2", children: _jsx(SidebarMenuItem, { children: _jsx(SidebarMenuButton, { isActive: true, children: _jsx(AgentListRow, { color: COBALTO, form: "orbit", name: "Invoices", size: 24 }) }) }) }) }), activityRailLabel: "Agents", className: "h-full", primaryPaneLabel: "Conversation", title: "Invoices", children: _jsx("p", { className: "p-4 text-sm text-muted-foreground", children: "The Agent's conversation." }) }) })),
|
|
94
92
|
Footer: () => (_jsx(Footer, { children: _jsxs(FooterInner, { children: [_jsx(FooterBrand, { "aria-label": "nadicode", href: "#top", children: _jsx(BrandWordmark, { alt: "" }) }), _jsx(FooterIdentity, { children: "Agents that do the work, for Italian companies." }), _jsxs(FooterNav, { "aria-label": "Company", children: [_jsx("a", { href: "#privacy", children: "Privacy" }), _jsx("a", { href: "#terms", children: "Terms" })] }), _jsx(FooterMeta, { children: "\u00A9 2026 nadicode" })] }) })),
|
|
95
93
|
PortalSidebarFrame: () => (_jsx(Navigation, { children: _jsx(PortalSidebarFrame, { account: { name: "Ada Rossi", initials: "AR", lines: ["Acme S.r.l."] }, bands: [
|
|
96
94
|
{
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type UsageName = "ActivityFeed" | "AgentProfileCard" | "CatalogDrawer" | "CollectionFilters" | "CollectionPage" | "CollectionToolbar" | "ConfirmDialog" | "EntryScene" | "FormDialog" | "FormDrawer" | "LibraryShelf" | "ObjectPage" | "ObjectSection" | "OverviewPage" | "PageHeader" | "RecordList" | "RecordSheet" | "RowEditForm" | "SettingsPage" | "SettingsSection" | "Button" | "ButtonGroup" | "ButtonLink" | "CopyButton" | "LoadMoreButton" | "PageActions" | "Calendar" | "ClearableInput" | "CollectionSearch" | "Field" | "Input" | "InputGroup" | "InputOTP" | "Label" | "NativeSelect" | "SettingsField" | "SettingsRows" | "Slider" | "Textarea" | "Checkbox" | "ChoiceboxGroup" | "CollectionSort" | "Combobox" | "ModelSelect" | "MultiSelect" | "RadioGroup" | "SegmentedChoice" | "SegmentedControl" | "Select" | "Switch" | "ThemeModeSegments" | "ThemeModeSwitcher" | "Toggle" | "ToggleGroup" | "ActionStatus" | "AgentOrb" | "AppMark" | "ArchIcon" | "Avatar" | "Badge" | "BrandWordmark" | "CheckCounts" | "FileTypeIcon" | "IdentityMark" | "ModelIdentity" | "ModelMark" | "PlatformMark" | "ProgressChecklist" | "RecordIdentity" | "StatusBadge" | "StatusDot" | "Tag" | "AgentListRow" | "Breadcrumb" | "CommandDialog" | "
|
|
1
|
+
export type UsageName = "ActivityFeed" | "AgentProfileCard" | "CatalogDrawer" | "CollectionFilters" | "CollectionPage" | "CollectionToolbar" | "ConfirmDialog" | "EntryScene" | "FormDialog" | "FormDrawer" | "LibraryShelf" | "ObjectPage" | "ObjectSection" | "OverviewPage" | "PageHeader" | "RecordList" | "RecordSheet" | "RowEditForm" | "SettingsPage" | "SettingsSection" | "Button" | "ButtonGroup" | "ButtonLink" | "CopyButton" | "LoadMoreButton" | "PageActions" | "Calendar" | "ClearableInput" | "CollectionSearch" | "Field" | "Input" | "InputGroup" | "InputOTP" | "Label" | "NativeSelect" | "SettingsField" | "SettingsRows" | "Slider" | "Textarea" | "Checkbox" | "ChoiceboxGroup" | "CollectionSort" | "Combobox" | "ModelSelect" | "MultiSelect" | "RadioGroup" | "SegmentedChoice" | "SegmentedControl" | "Select" | "Switch" | "ThemeModeSegments" | "ThemeModeSwitcher" | "Toggle" | "ToggleGroup" | "ActionStatus" | "AgentOrb" | "AppMark" | "ArchIcon" | "Avatar" | "Badge" | "BrandWordmark" | "CheckCounts" | "FileTypeIcon" | "IdentityMark" | "ModelIdentity" | "ModelMark" | "PlatformMark" | "ProgressChecklist" | "RecordIdentity" | "StatusBadge" | "StatusDot" | "Tag" | "AgentListRow" | "Breadcrumb" | "CommandDialog" | "Footer" | "PortalSidebarFrame" | "ScopeSwitcher" | "Sidebar" | "SidebarBrand" | "SidebarFind" | "SidebarFrame" | "SidebarMenuChevron" | "SidebarSections" | "Tabs" | "TabsNav" | "textLinkVariants" | "AgentCard" | "Card" | "CardRow" | "CodeBlock" | "DataTable" | "DiffCount" | "DisclosureRow" | "FileDiff" | "Gauge" | "Item" | "Kbd" | "MiddleTruncate" | "ObjectFacts" | "PairingCode" | "Progress" | "QrCode" | "RecordTime" | "RunTimeline" | "SettingsFactsSection" | "Snippet" | "Table" | "TableCard" | "TableValue" | "TextWithCopyButton" | "UsageMeter" | "Alert" | "EmptyState" | "EntryProgress" | "EntryStageList" | "HoverCard" | "LabelledPicture" | "MessageNotice" | "NoticeBanner" | "PendingLabel" | "Skeleton" | "SkeletonRegion" | "Toaster" | "Tooltip" | "UpdateCard" | "WaitingLine" | "AccountMenu" | "ActionContextMenu" | "ActionMenu" | "AlertDialog" | "ContextMenu" | "Dialog" | "Drawer" | "DropdownMenu" | "GlassControl" | "MenuChoiceRow" | "Popover" | "Sheet" | "ThemeModeMenu" | "ActivityCalendar" | "ChartAreaStacked" | "ChartBarHorizontal" | "ChartBarMultiple" | "ChartBarStacked" | "ChartCard" | "ChartContainer" | "ChartSparkline" | "DateRangeControl" | "KpiCard" | "TrendBadge" | "createEntityColorMap" | "Accordion" | "AspectRatio" | "BrandField" | "Carousel" | "Collapsible" | "CompanyCard" | "Disclosure" | "HiveScene" | "NadiaPresence" | "NumberedSteps" | "Prose" | "ReadingColumn" | "ResizablePanelGroup" | "ScrollArea" | "Separator" | "ToolIcon";
|
|
2
2
|
export type UsageFamily = "Compositions" | "Actions" | "Inputs" | "Choices" | "Status" | "Navigation" | "Data" | "Feedback" | "Menus" | "Charts" | "Other";
|
|
3
3
|
export type ComponentUsage = {
|
|
4
4
|
name: UsageName;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage.generated.d.ts","sourceRoot":"","sources":["../../src/showcase/usage.generated.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,SAAS,GACjB,cAAc,GACd,kBAAkB,GAClB,eAAe,GACf,mBAAmB,GACnB,gBAAgB,GAChB,mBAAmB,GACnB,eAAe,GACf,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,cAAc,GACd,YAAY,GACZ,eAAe,GACf,cAAc,GACd,YAAY,GACZ,YAAY,GACZ,aAAa,GACb,aAAa,GACb,cAAc,GACd,iBAAiB,GACjB,QAAQ,GACR,aAAa,GACb,YAAY,GACZ,YAAY,GACZ,gBAAgB,GAChB,aAAa,GACb,UAAU,GACV,gBAAgB,GAChB,kBAAkB,GAClB,OAAO,GACP,OAAO,GACP,YAAY,GACZ,UAAU,GACV,OAAO,GACP,cAAc,GACd,eAAe,GACf,cAAc,GACd,QAAQ,GACR,UAAU,GACV,UAAU,GACV,gBAAgB,GAChB,gBAAgB,GAChB,UAAU,GACV,aAAa,GACb,aAAa,GACb,YAAY,GACZ,iBAAiB,GACjB,kBAAkB,GAClB,QAAQ,GACR,QAAQ,GACR,mBAAmB,GACnB,mBAAmB,GACnB,QAAQ,GACR,aAAa,GACb,cAAc,GACd,UAAU,GACV,SAAS,GACT,UAAU,GACV,QAAQ,GACR,OAAO,GACP,eAAe,GACf,aAAa,GACb,cAAc,GACd,cAAc,GACd,eAAe,GACf,WAAW,GACX,cAAc,GACd,mBAAmB,GACnB,gBAAgB,GAChB,aAAa,GACb,WAAW,GACX,KAAK,GACL,cAAc,GACd,YAAY,GACZ,eAAe,GACf,
|
|
1
|
+
{"version":3,"file":"usage.generated.d.ts","sourceRoot":"","sources":["../../src/showcase/usage.generated.ts"],"names":[],"mappings":"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"}
|
|
@@ -839,17 +839,6 @@ export const USAGE = [
|
|
|
839
839
|
words: '"`<CommandMenu.Item>` children are Title Case verb phrases (`Deploy Project`, `Invite Team Member`). Avoid navigation phrasing like `Go to project page`; CommandMenu commands act, not browse." (https://vercel.com/geist/command-menu) "`CommandMenuPage.label` is Title Case and names the scope (`Projects`, `Team Settings`)." (https://vercel.com/geist/command-menu) "`CommandMenuPage.placeholder` is sentence case, action-oriented, and ends with `…` (`Search projects…`, `Type a command or search…`). Bare `Search…` is wrong because it doesn’t name the scope." (https://vercel.com/geist/command-menu) "`<CommandMenu.Group heading>` is Title Case, 1–2 words (`Actions`, `Recent`)." (https://vercel.com/geist/command-menu) Ours: groups are plural nouns in sentence case (*Agents*, *Go to*), one or two words. Items are names, or verb and noun for a creation page (*New Agent*), because the dialog goes to places. The placeholder names what is searched, never a bare "Search". No match quotes the query.',
|
|
840
840
|
access: '"Use `aria-live="polite"` on the result count so screen readers hear how the list narrows as the user types." (https://vercel.com/geist/command-menu) "Up/Down arrows move highlight, Enter activates, Escape closes. Backspace at an empty input pops the page stack." (https://vercel.com/geist/command-menu) "Display each item’s `keybind` as a `Kbd` slot so the shortcut is discoverable to sighted users and announced as a label to screen readers." (https://vercel.com/geist/command-menu) Ours: a dialog with a screen-reader `title` and `description`, both required; the *Esc* key is a button named by `closeLabel`, which is required; the field is a combobox over a listbox; the highlighted item is `aria-selected`. A polite live region reads `resultCount` as the list narrows, and it is required. `CommandInput` requires its `placeholder`, `CommandGroup` its `heading` and `CommandItem` its `onSelect`, so no field, group or row is left unnamed or inert; a row with no group stands outside a `CommandGroup`. A shortcut is a `CommandShortcut`, drawn as `kbd` elements. With no pages there is no stack for Backspace to pop.',
|
|
841
841
|
},
|
|
842
|
-
{
|
|
843
|
-
name: "DesktopAppShell",
|
|
844
|
-
module: "desktop-shell",
|
|
845
|
-
family: "Navigation",
|
|
846
|
-
summary: "A desktop window's frame: title bar, rails, resizable panes and status bar.",
|
|
847
|
-
when: "A desktop product's whole window: Nadia's left column (the Agents list, then an Agent's sections behind *‹ Agents*), its workspace and its side panes.",
|
|
848
|
-
instead: "The Portal's column is `PortalSidebarFrame` inside its `Sidebar`. Both draw their rows with the same `SidebarMenuButton` and end with the same `AccountMenu`.",
|
|
849
|
-
behaviour: "One 44 px band shares the window buttons and the window's commands. The workspace splits into resizable panes; the secondary pane and the inspector rail appear only when given. Each Agent row is her orb, name and one line.",
|
|
850
|
-
words: "Every pane label is the product's word for what it holds. An Agent's line says her job in under six words: *Writes quotes from the price list*.",
|
|
851
|
-
access: "Each pane and rail is a labelled region; the orb beside a name is decorative.",
|
|
852
|
-
},
|
|
853
842
|
{
|
|
854
843
|
name: "Footer",
|
|
855
844
|
module: "footer",
|
|
@@ -1835,7 +1824,7 @@ export const USAGE = [
|
|
|
1835
1824
|
family: "Other",
|
|
1836
1825
|
summary: "Panels a person resizes by dragging the handle between them.",
|
|
1837
1826
|
when: "Side-by-side panes whose balance a person sets: a conversation and its side panel. Nadia's side panel is this, with the window's grid column as the group; it is not a hand-made separator.",
|
|
1838
|
-
instead: "The product frame's sidebar resizes through `Sidebar`'s `resize` handle
|
|
1827
|
+
instead: "The product frame's sidebar resizes through `Sidebar`'s `resize` handle. A width a person never changes is a plain grid column. A window too narrow for the panes side by side gets a compact alternative, one pane at a time, instead of squeezed panes.",
|
|
1839
1828
|
behaviour: 'The handle moves on drag and on arrow keys, and returns the panels to their default size on a double click; each panel keeps its minimum, set where its content still reads, and its maximum. A number is pixels (`minSize={352}`), a string without a unit is a percentage (`defaultSize="60"`), and `"20rem"` and `"40vw"` are read as written, so a panel that must keep a readable width is set in pixels and the pane beside it takes the rest. The handle is a 1 px line with a 4 px wide hit area centred on it; it takes the ring colour while hovered, dragged or focused, and `withHandle` adds a grip for a handle that must be found. Colour: neutral until it is touched, then the ring colour, and nothing else. The group holds sizes only while it is mounted; the product owns persisting them.',
|
|
1840
1829
|
words: "Required: the handle's name, a verb phrase from the product's catalogue: *Resize the side panel*. A panel has none of its own.",
|
|
1841
1830
|
access: "The handle is the resizable library's focusable `separator` with its value, named by the `aria-label` the type requires; the arrow keys move it and Home and End take it to the ends of its range.",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nadicodeai/ui",
|
|
3
|
-
"version": "12.1.
|
|
3
|
+
"version": "12.1.116",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -77,13 +77,14 @@
|
|
|
77
77
|
"test:distribution": "node ../../tools/release/package-smoke-test.mjs"
|
|
78
78
|
},
|
|
79
79
|
"dependencies": {
|
|
80
|
-
"@assistant-ui/react": "0.15.
|
|
81
|
-
"@assistant-ui/react-markdown": "0.14.
|
|
80
|
+
"@assistant-ui/react": "0.15.28",
|
|
81
|
+
"@assistant-ui/react-markdown": "0.14.22",
|
|
82
82
|
"@base-ui/react": "^1.9.0",
|
|
83
|
-
"@iconify-icons/logos": "^2.0.
|
|
83
|
+
"@iconify-icons/logos": "^2.0.3",
|
|
84
84
|
"@iconify/react": "^6.0.2",
|
|
85
|
-
"@nadicodeai/design-system": "12.1.
|
|
86
|
-
"@tanstack/react-table": "^9.
|
|
85
|
+
"@nadicodeai/design-system": "12.1.116",
|
|
86
|
+
"@tanstack/react-table": "^9.3.1",
|
|
87
|
+
"@vgpu/wgsl": "0.6.0",
|
|
87
88
|
"class-variance-authority": "^0.7.1",
|
|
88
89
|
"clsx": "^2.1.1",
|
|
89
90
|
"cmdk": "^1.1.1",
|
|
@@ -95,14 +96,14 @@
|
|
|
95
96
|
"next-themes": "^0.4.6",
|
|
96
97
|
"qrcode": "^1.5.4",
|
|
97
98
|
"react-day-picker": "^10.0.2",
|
|
98
|
-
"react-resizable-panels": "^4.14.
|
|
99
|
+
"react-resizable-panels": "^4.14.5",
|
|
99
100
|
"recharts": "^3.10.1",
|
|
100
101
|
"remark-gfm": "^4.0.1",
|
|
101
102
|
"sonner": "^2.0.8",
|
|
102
103
|
"tailwind-merge": "^3.7.0",
|
|
103
104
|
"thinking-orbs": "0.3.2",
|
|
104
105
|
"tw-animate-css": "^1.4.0",
|
|
105
|
-
"vgpu": "0.
|
|
106
|
+
"vgpu": "0.6.0",
|
|
106
107
|
"zustand": "^5.0.14"
|
|
107
108
|
},
|
|
108
109
|
"peerDependencies": {
|
|
@@ -112,25 +113,28 @@
|
|
|
112
113
|
"tailwindcss": "^4.3.3"
|
|
113
114
|
},
|
|
114
115
|
"devDependencies": {
|
|
116
|
+
"@arethetypeswrong/cli": "^0.18.5",
|
|
115
117
|
"@lobehub/icons-static-svg": "^1.95.1",
|
|
116
118
|
"@nadicodeai/eslint-plugin": "*",
|
|
117
119
|
"@stryker-mutator/core": "10.0.0",
|
|
118
120
|
"@stryker-mutator/vitest-runner": "10.0.0",
|
|
119
121
|
"@tailwindcss/postcss": "^4.3.3",
|
|
120
122
|
"@testing-library/react": "^16.3.3",
|
|
121
|
-
"@testing-library/user-event": "^14.6.
|
|
123
|
+
"@testing-library/user-event": "^14.6.8",
|
|
122
124
|
"@types/react": "19.3.0",
|
|
123
125
|
"@types/react-dom": "19.3.0",
|
|
124
126
|
"axe-core": "^4.14.0",
|
|
125
127
|
"esbuild": "^0.28.2",
|
|
126
128
|
"eslint": "^9.39.4",
|
|
127
|
-
"jsdom": "^30.1.
|
|
128
|
-
"postcss": "^8.5.
|
|
129
|
+
"jsdom": "^30.1.3",
|
|
130
|
+
"postcss": "^8.5.30",
|
|
131
|
+
"publint": "^0.3.25",
|
|
129
132
|
"react": "19.3.1",
|
|
130
133
|
"react-dom": "19.3.1",
|
|
131
134
|
"shadcn": "4.21.5",
|
|
132
135
|
"tailwindcss": "^4.3.3",
|
|
133
136
|
"typescript": "^6",
|
|
137
|
+
"typescript-native": "npm:typescript@7.0.2",
|
|
134
138
|
"vitest": "^5.0.0"
|
|
135
139
|
}
|
|
136
140
|
}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import * as React from "react";
|
|
2
|
-
type DesktopAppShellProps = Omit<React.ComponentProps<"section">, "title"> & {
|
|
3
|
-
title?: React.ReactNode;
|
|
4
|
-
titlebar?: React.ReactNode;
|
|
5
|
-
titlebarActions?: React.ReactNode;
|
|
6
|
-
activityRail?: React.ReactNode;
|
|
7
|
-
inspectorRail?: React.ReactNode;
|
|
8
|
-
secondaryPane?: React.ReactNode;
|
|
9
|
-
statusbar?: React.ReactNode;
|
|
10
|
-
children: React.ReactNode;
|
|
11
|
-
activityRailLabel?: string;
|
|
12
|
-
primaryPaneLabel?: string;
|
|
13
|
-
secondaryPaneLabel?: string;
|
|
14
|
-
inspectorRailLabel?: string;
|
|
15
|
-
secondaryResizeLabel?: string;
|
|
16
|
-
inspectorResizeLabel?: string;
|
|
17
|
-
primaryPaneSize?: number;
|
|
18
|
-
secondaryPaneSize?: number;
|
|
19
|
-
inspectorPaneSize?: number;
|
|
20
|
-
titlebarClassName?: string;
|
|
21
|
-
bodyClassName?: string;
|
|
22
|
-
primaryPaneClassName?: string;
|
|
23
|
-
secondaryPaneClassName?: string;
|
|
24
|
-
inspectorRailClassName?: string;
|
|
25
|
-
statusbarClassName?: string;
|
|
26
|
-
};
|
|
27
|
-
/**
|
|
28
|
-
* A desktop window's frame: title bar, rails, resizable panes and status bar.
|
|
29
|
-
*
|
|
30
|
-
* @family Navigation
|
|
31
|
-
* @when A desktop product's whole window: Nadia's left column (the Agents list, then an Agent's
|
|
32
|
-
* sections behind *‹ Agents*), its workspace and its side panes.
|
|
33
|
-
* @instead The Portal's column is `PortalSidebarFrame` inside its `Sidebar`. Both draw their
|
|
34
|
-
* rows with the same `SidebarMenuButton` and end with the same `AccountMenu`.
|
|
35
|
-
* @behaviour One 44 px band shares the window buttons and the window's commands. The workspace
|
|
36
|
-
* splits into resizable panes; the secondary pane and the inspector rail appear only when given.
|
|
37
|
-
* Each Agent row is her orb, name and one line.
|
|
38
|
-
* @words Every pane label is the product's word for what it holds. An Agent's line says her job in
|
|
39
|
-
* under six words: *Writes quotes from the price list*.
|
|
40
|
-
* @access Each pane and rail is a labelled region; the orb beside a name is decorative.
|
|
41
|
-
*/
|
|
42
|
-
declare function DesktopAppShell({ title, titlebar, titlebarActions, activityRail, inspectorRail, secondaryPane, statusbar, children, activityRailLabel, primaryPaneLabel, secondaryPaneLabel, inspectorRailLabel, secondaryResizeLabel, inspectorResizeLabel, primaryPaneSize, secondaryPaneSize, inspectorPaneSize, className, titlebarClassName, bodyClassName, primaryPaneClassName, secondaryPaneClassName, inspectorRailClassName, statusbarClassName, ...props }: DesktopAppShellProps): React.JSX.Element;
|
|
43
|
-
export { DesktopAppShell };
|
|
44
|
-
export type { DesktopAppShellProps };
|
|
45
|
-
//# sourceMappingURL=desktop-shell.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"desktop-shell.d.ts","sourceRoot":"","sources":["../../src/components/desktop-shell.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,KAAK,oBAAoB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,GAAG;IAC3E,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,eAAe,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAClC,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC/B,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAChC,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAChC,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC5B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,iBAAS,eAAe,CAAC,EACvB,KAAK,EACL,QAAQ,EACR,eAAe,EACf,YAAY,EACZ,aAAa,EACb,aAAa,EACb,SAAS,EACT,QAAQ,EACR,iBAA8B,EAC9B,gBAAsC,EACtC,kBAA0C,EAC1C,kBAAgC,EAChC,oBAAuD,EACvD,oBAA6C,EAC7C,eAA2D,EAC3D,iBAA2C,EAC3C,iBAAsB,EACtB,SAAS,EACT,iBAAiB,EACjB,aAAa,EACb,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EACtB,kBAAkB,EAClB,GAAG,KAAK,EACT,EAAE,oBAAoB,qBAyGtB;AAED,OAAO,EAAE,eAAe,EAAE,CAAC;AAC3B,YAAY,EAAE,oBAAoB,EAAE,CAAC"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
-
import { cn } from "../lib/utils.js";
|
|
4
|
-
import { ResizableHandle, ResizablePanel, ResizablePanelGroup } from "./resizable.js";
|
|
5
|
-
/**
|
|
6
|
-
* A desktop window's frame: title bar, rails, resizable panes and status bar.
|
|
7
|
-
*
|
|
8
|
-
* @family Navigation
|
|
9
|
-
* @when A desktop product's whole window: Nadia's left column (the Agents list, then an Agent's
|
|
10
|
-
* sections behind *‹ Agents*), its workspace and its side panes.
|
|
11
|
-
* @instead The Portal's column is `PortalSidebarFrame` inside its `Sidebar`. Both draw their
|
|
12
|
-
* rows with the same `SidebarMenuButton` and end with the same `AccountMenu`.
|
|
13
|
-
* @behaviour One 44 px band shares the window buttons and the window's commands. The workspace
|
|
14
|
-
* splits into resizable panes; the secondary pane and the inspector rail appear only when given.
|
|
15
|
-
* Each Agent row is her orb, name and one line.
|
|
16
|
-
* @words Every pane label is the product's word for what it holds. An Agent's line says her job in
|
|
17
|
-
* under six words: *Writes quotes from the price list*.
|
|
18
|
-
* @access Each pane and rail is a labelled region; the orb beside a name is decorative.
|
|
19
|
-
*/
|
|
20
|
-
function DesktopAppShell({ title, titlebar, titlebarActions, activityRail, inspectorRail, secondaryPane, statusbar, children, activityRailLabel = "Activity", primaryPaneLabel = "Primary workspace", secondaryPaneLabel = "Secondary workspace", inspectorRailLabel = "Inspector", secondaryResizeLabel = "Resize the secondary workspace", inspectorResizeLabel = "Resize the inspector", primaryPaneSize = secondaryPane || inspectorRail ? 58 : 100, secondaryPaneSize = inspectorRail ? 24 : 36, inspectorPaneSize = 18, className, titlebarClassName, bodyClassName, primaryPaneClassName, secondaryPaneClassName, inspectorRailClassName, statusbarClassName, ...props }) {
|
|
21
|
-
return (_jsxs("section", { "data-slot": "desktop-app-shell", className: cn("flex h-svh min-h-0 flex-col overflow-hidden border bg-background text-foreground", className), ...props, children: [_jsxs("header", { "data-slot": "desktop-app-titlebar", className: cn("flex h-11 shrink-0 items-center justify-between gap-3 border-b bg-background px-3", titlebarClassName), children: [titlebar ?? (_jsx("div", { "data-slot": "desktop-app-titlebar-content", className: "flex min-w-0 flex-1 items-center gap-2", children: title && _jsx("p", { className: "m-0 truncate text-sm font-medium", children: title }) })), titlebarActions && (_jsx("div", { "data-slot": "desktop-app-titlebar-actions", className: "flex shrink-0 items-center gap-2", children: titlebarActions }))] }), _jsxs("div", { "data-slot": "desktop-app-body", className: cn("flex min-h-0 flex-1", bodyClassName), children: [activityRail && (_jsx("nav", { "data-slot": "desktop-app-activity-rail", "aria-label": activityRailLabel, className: "flex w-14 shrink-0 flex-col items-center gap-2 border-r bg-sidebar p-2 text-sidebar-foreground", children: activityRail })), _jsx("div", { "data-slot": "desktop-app-panes", className: "min-w-0 flex-1", children: _jsxs(ResizablePanelGroup, { orientation: "horizontal", className: "min-w-0 flex-1", children: [_jsx(ResizablePanel, { defaultSize: `${primaryPaneSize}%`, minSize: "30%", children: _jsx("section", { "data-slot": "desktop-app-primary-pane", "aria-label": primaryPaneLabel, className: cn("h-full min-w-0 overflow-auto bg-background", primaryPaneClassName), children: children }) }), secondaryPane && (_jsxs(_Fragment, { children: [_jsx(ResizableHandle, { "aria-label": secondaryResizeLabel, withHandle: true }), _jsx(ResizablePanel, { defaultSize: `${secondaryPaneSize}%`, minSize: "18%", children: _jsx("section", { "data-slot": "desktop-app-secondary-pane", "aria-label": secondaryPaneLabel, className: cn("h-full min-w-0 overflow-auto bg-background", secondaryPaneClassName), children: secondaryPane }) })] })), inspectorRail && (_jsxs(_Fragment, { children: [_jsx(ResizableHandle, { "aria-label": inspectorResizeLabel, withHandle: true }), _jsx(ResizablePanel, { defaultSize: `${inspectorPaneSize}%`, minSize: "16%", maxSize: "36%", children: _jsx("aside", { "data-slot": "desktop-app-inspector-rail", "aria-label": inspectorRailLabel, className: cn("h-full min-w-0 overflow-auto bg-background", inspectorRailClassName), children: inspectorRail }) })] }))] }) })] }), statusbar && (_jsx("footer", { "data-slot": "desktop-app-statusbar", className: cn("flex min-h-8 shrink-0 items-center justify-between gap-3 border-t bg-background px-3 text-xs text-muted-foreground", statusbarClassName), children: statusbar }))] }));
|
|
22
|
-
}
|
|
23
|
-
export { DesktopAppShell };
|