@hanzo/ui 8.0.66 → 8.0.69
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/backends/gui/accordion.cjs +69 -0
- package/dist/backends/gui/accordion.d.ts +57 -0
- package/dist/backends/gui/accordion.d.ts.map +1 -0
- package/dist/backends/gui/accordion.js +64 -0
- package/dist/backends/gui/accordion.js.map +1 -0
- package/dist/backends/gui/alert-dialog.cjs +91 -0
- package/dist/backends/gui/alert-dialog.d.ts +77 -0
- package/dist/backends/gui/alert-dialog.d.ts.map +1 -0
- package/dist/backends/gui/alert-dialog.js +79 -0
- package/dist/backends/gui/alert-dialog.js.map +1 -0
- package/dist/backends/gui/context-menu.cjs +189 -0
- package/dist/backends/gui/context-menu.d.ts +116 -0
- package/dist/backends/gui/context-menu.d.ts.map +1 -0
- package/dist/backends/gui/context-menu.js +140 -0
- package/dist/backends/gui/context-menu.js.map +1 -0
- package/dist/backends/gui/dropdown-menu.d.ts +1 -1
- package/dist/backends/gui/hover-card.cjs +76 -0
- package/dist/backends/gui/hover-card.d.ts +57 -0
- package/dist/backends/gui/hover-card.d.ts.map +1 -0
- package/dist/backends/gui/hover-card.js +72 -0
- package/dist/backends/gui/hover-card.js.map +1 -0
- package/dist/backends/gui/index.cjs +53 -3
- package/dist/backends/gui/index.d.ts +7 -1
- package/dist/backends/gui/index.d.ts.map +1 -1
- package/dist/backends/gui/index.js +12 -1
- package/dist/backends/gui/index.js.map +1 -1
- package/dist/backends/gui/layout.cjs +3 -2
- package/dist/backends/gui/layout.d.ts +1 -1
- package/dist/backends/gui/layout.d.ts.map +1 -1
- package/dist/backends/gui/layout.js +2 -2
- package/dist/backends/gui/layout.js.map +1 -1
- package/dist/backends/gui/radio-group.cjs +47 -0
- package/dist/backends/gui/radio-group.d.ts +36 -0
- package/dist/backends/gui/radio-group.d.ts.map +1 -0
- package/dist/backends/gui/radio-group.js +44 -0
- package/dist/backends/gui/radio-group.js.map +1 -0
- package/dist/backends/gui/toggle-group.cjs +114 -0
- package/dist/backends/gui/toggle-group.d.ts +57 -0
- package/dist/backends/gui/toggle-group.d.ts.map +1 -0
- package/dist/backends/gui/toggle-group.js +112 -0
- package/dist/backends/gui/toggle-group.js.map +1 -0
- package/dist/gallery.cjs +2 -2
- package/dist/gallery.d.ts.map +1 -1
- package/dist/gallery.js +3 -3
- package/dist/gallery.js.map +1 -1
- package/dist/glass.css +117 -0
- package/dist/gui-config.cjs +76 -43
- package/dist/gui-config.d.ts +204 -204
- package/dist/gui-config.d.ts.map +1 -1
- package/dist/gui-config.js +76 -43
- package/dist/gui-config.js.map +1 -1
- package/dist/index.cjs +57 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -1
- package/dist/index.js.map +1 -1
- package/dist/primitives/Accordion.cjs +8 -0
- package/dist/primitives/Accordion.d.ts +2 -0
- package/dist/primitives/Accordion.d.ts.map +1 -0
- package/dist/primitives/Accordion.js +5 -0
- package/dist/primitives/Accordion.js.map +1 -0
- package/dist/primitives/AccordionContent.cjs +8 -0
- package/dist/primitives/AccordionContent.d.ts +2 -0
- package/dist/primitives/AccordionContent.d.ts.map +1 -0
- package/dist/primitives/AccordionContent.js +5 -0
- package/dist/primitives/AccordionContent.js.map +1 -0
- package/dist/primitives/AccordionItem.cjs +8 -0
- package/dist/primitives/AccordionItem.d.ts +2 -0
- package/dist/primitives/AccordionItem.d.ts.map +1 -0
- package/dist/primitives/AccordionItem.js +5 -0
- package/dist/primitives/AccordionItem.js.map +1 -0
- package/dist/primitives/AccordionTrigger.cjs +8 -0
- package/dist/primitives/AccordionTrigger.d.ts +2 -0
- package/dist/primitives/AccordionTrigger.d.ts.map +1 -0
- package/dist/primitives/AccordionTrigger.js +5 -0
- package/dist/primitives/AccordionTrigger.js.map +1 -0
- package/dist/primitives/AlertDialog.cjs +8 -0
- package/dist/primitives/AlertDialog.d.ts +2 -0
- package/dist/primitives/AlertDialog.d.ts.map +1 -0
- package/dist/primitives/AlertDialog.js +5 -0
- package/dist/primitives/AlertDialog.js.map +1 -0
- package/dist/primitives/AlertDialogAction.cjs +8 -0
- package/dist/primitives/AlertDialogAction.d.ts +2 -0
- package/dist/primitives/AlertDialogAction.d.ts.map +1 -0
- package/dist/primitives/AlertDialogAction.js +5 -0
- package/dist/primitives/AlertDialogAction.js.map +1 -0
- package/dist/primitives/AlertDialogCancel.cjs +8 -0
- package/dist/primitives/AlertDialogCancel.d.ts +2 -0
- package/dist/primitives/AlertDialogCancel.d.ts.map +1 -0
- package/dist/primitives/AlertDialogCancel.js +5 -0
- package/dist/primitives/AlertDialogCancel.js.map +1 -0
- package/dist/primitives/AlertDialogContent.cjs +8 -0
- package/dist/primitives/AlertDialogContent.d.ts +2 -0
- package/dist/primitives/AlertDialogContent.d.ts.map +1 -0
- package/dist/primitives/AlertDialogContent.js +5 -0
- package/dist/primitives/AlertDialogContent.js.map +1 -0
- package/dist/primitives/AlertDialogDescription.cjs +8 -0
- package/dist/primitives/AlertDialogDescription.d.ts +2 -0
- package/dist/primitives/AlertDialogDescription.d.ts.map +1 -0
- package/dist/primitives/AlertDialogDescription.js +5 -0
- package/dist/primitives/AlertDialogDescription.js.map +1 -0
- package/dist/primitives/AlertDialogFooter.cjs +8 -0
- package/dist/primitives/AlertDialogFooter.d.ts +2 -0
- package/dist/primitives/AlertDialogFooter.d.ts.map +1 -0
- package/dist/primitives/AlertDialogFooter.js +5 -0
- package/dist/primitives/AlertDialogFooter.js.map +1 -0
- package/dist/primitives/AlertDialogHeader.cjs +8 -0
- package/dist/primitives/AlertDialogHeader.d.ts +2 -0
- package/dist/primitives/AlertDialogHeader.d.ts.map +1 -0
- package/dist/primitives/AlertDialogHeader.js +5 -0
- package/dist/primitives/AlertDialogHeader.js.map +1 -0
- package/dist/primitives/AlertDialogOverlay.cjs +8 -0
- package/dist/primitives/AlertDialogOverlay.d.ts +2 -0
- package/dist/primitives/AlertDialogOverlay.d.ts.map +1 -0
- package/dist/primitives/AlertDialogOverlay.js +5 -0
- package/dist/primitives/AlertDialogOverlay.js.map +1 -0
- package/dist/primitives/AlertDialogPortal.cjs +8 -0
- package/dist/primitives/AlertDialogPortal.d.ts +2 -0
- package/dist/primitives/AlertDialogPortal.d.ts.map +1 -0
- package/dist/primitives/AlertDialogPortal.js +5 -0
- package/dist/primitives/AlertDialogPortal.js.map +1 -0
- package/dist/primitives/AlertDialogTitle.cjs +8 -0
- package/dist/primitives/AlertDialogTitle.d.ts +2 -0
- package/dist/primitives/AlertDialogTitle.d.ts.map +1 -0
- package/dist/primitives/AlertDialogTitle.js +5 -0
- package/dist/primitives/AlertDialogTitle.js.map +1 -0
- package/dist/primitives/AlertDialogTrigger.cjs +8 -0
- package/dist/primitives/AlertDialogTrigger.d.ts +2 -0
- package/dist/primitives/AlertDialogTrigger.d.ts.map +1 -0
- package/dist/primitives/AlertDialogTrigger.js +5 -0
- package/dist/primitives/AlertDialogTrigger.js.map +1 -0
- package/dist/primitives/Anchor.cjs +8 -0
- package/dist/primitives/Anchor.d.ts +2 -0
- package/dist/primitives/Anchor.d.ts.map +1 -0
- package/dist/primitives/Anchor.js +5 -0
- package/dist/primitives/Anchor.js.map +1 -0
- package/dist/primitives/HoverCard.cjs +8 -0
- package/dist/primitives/HoverCard.d.ts +2 -0
- package/dist/primitives/HoverCard.d.ts.map +1 -0
- package/dist/primitives/HoverCard.js +5 -0
- package/dist/primitives/HoverCard.js.map +1 -0
- package/dist/primitives/HoverCardContent.cjs +8 -0
- package/dist/primitives/HoverCardContent.d.ts +2 -0
- package/dist/primitives/HoverCardContent.d.ts.map +1 -0
- package/dist/primitives/HoverCardContent.js +5 -0
- package/dist/primitives/HoverCardContent.js.map +1 -0
- package/dist/primitives/HoverCardTrigger.cjs +8 -0
- package/dist/primitives/HoverCardTrigger.d.ts +2 -0
- package/dist/primitives/HoverCardTrigger.d.ts.map +1 -0
- package/dist/primitives/HoverCardTrigger.js +5 -0
- package/dist/primitives/HoverCardTrigger.js.map +1 -0
- package/dist/primitives/RadioGroup.cjs +8 -0
- package/dist/primitives/RadioGroup.d.ts +2 -0
- package/dist/primitives/RadioGroup.d.ts.map +1 -0
- package/dist/primitives/RadioGroup.js +5 -0
- package/dist/primitives/RadioGroup.js.map +1 -0
- package/dist/primitives/RadioGroupItem.cjs +8 -0
- package/dist/primitives/RadioGroupItem.d.ts +2 -0
- package/dist/primitives/RadioGroupItem.d.ts.map +1 -0
- package/dist/primitives/RadioGroupItem.js +5 -0
- package/dist/primitives/RadioGroupItem.js.map +1 -0
- package/dist/primitives/ToggleGroup.cjs +8 -0
- package/dist/primitives/ToggleGroup.d.ts +2 -0
- package/dist/primitives/ToggleGroup.d.ts.map +1 -0
- package/dist/primitives/ToggleGroup.js +5 -0
- package/dist/primitives/ToggleGroup.js.map +1 -0
- package/dist/primitives/ToggleGroupItem.cjs +8 -0
- package/dist/primitives/ToggleGroupItem.d.ts +2 -0
- package/dist/primitives/ToggleGroupItem.d.ts.map +1 -0
- package/dist/primitives/ToggleGroupItem.js +5 -0
- package/dist/primitives/ToggleGroupItem.js.map +1 -0
- package/dist/product/AppHeader.cjs +3 -3
- package/dist/product/AppHeader.js +3 -3
- package/dist/product/CommerceResource.cjs +1 -1
- package/dist/product/CommerceResource.js +1 -1
- package/dist/product/ConfirmDelete.cjs +1 -1
- package/dist/product/ConfirmDelete.js +1 -1
- package/dist/product/EmptyState.cjs +1 -1
- package/dist/product/EmptyState.js +1 -1
- package/dist/product/Field.cjs +8 -3
- package/dist/product/Field.d.ts.map +1 -1
- package/dist/product/Field.js +8 -3
- package/dist/product/Field.js.map +1 -1
- package/dist/product/Filters.cjs +1 -1
- package/dist/product/Filters.js +1 -1
- package/dist/product/OrgSwitcher.cjs +2 -2
- package/dist/product/OrgSwitcher.js +2 -2
- package/dist/product/Pagination.cjs +1 -1
- package/dist/product/Pagination.js +1 -1
- package/dist/product/PrimaryButton.cjs +12 -0
- package/dist/product/PrimaryButton.d.ts.map +1 -1
- package/dist/product/PrimaryButton.js +12 -0
- package/dist/product/PrimaryButton.js.map +1 -1
- package/dist/product/UserMenu.cjs +1 -1
- package/dist/product/UserMenu.js +1 -1
- package/dist/product/social/PostCard.cjs +1 -1
- package/dist/product/social/PostCard.js +1 -1
- package/dist/styles.css +244 -45
- package/dist/theme.css +190 -41
- package/package.json +2 -2
package/dist/theme.css
CHANGED
|
@@ -290,19 +290,25 @@
|
|
|
290
290
|
— the two are the SAME scale, mirrored. A surface/tenant overrides any --text-*
|
|
291
291
|
on :root to retune density on demand. */
|
|
292
292
|
:root{
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
--
|
|
298
|
-
|
|
299
|
-
--text-
|
|
300
|
-
--text-
|
|
301
|
-
--text-
|
|
302
|
-
--text-
|
|
303
|
-
--text-
|
|
304
|
-
--text-
|
|
305
|
-
--text-
|
|
293
|
+
/* The type knob. 1 is the published scale; every rung below multiplies by
|
|
294
|
+
it, so a surface or a person retunes the WHOLE ramp by setting one
|
|
295
|
+
number and no rung can drift out of relation with the others.
|
|
296
|
+
@hanzo/design's `vars({type})` emits exactly this name. */
|
|
297
|
+
--type-scale:1;
|
|
298
|
+
|
|
299
|
+
--text-xs:calc(0.6875rem * var(--type-scale, 1)); --leading-xs:calc(1rem * var(--type-scale, 1)); /* 11px — eyebrows / section labels */
|
|
300
|
+
--text-sm:calc(0.8125rem * var(--type-scale, 1)); --leading-sm:calc(1.15rem * var(--type-scale, 1)); /* 13px — nav labels, dense body */
|
|
301
|
+
--text-base:calc(0.875rem * var(--type-scale, 1)); --leading-base:calc(1.35rem * var(--type-scale, 1)); /* 14px — base app text (was 16px) */
|
|
302
|
+
--text-lg:calc(0.9375rem * var(--type-scale, 1)); --leading-lg:calc(1.4rem * var(--type-scale, 1)); /* 15px */
|
|
303
|
+
--text-xl:calc(1.0625rem * var(--type-scale, 1)); --leading-xl:calc(1.55rem * var(--type-scale, 1)); /* 17px */
|
|
304
|
+
--text-2xl:calc(1.3125rem * var(--type-scale, 1)); --leading-2xl:calc(1.7rem * var(--type-scale, 1)); /* 21px */
|
|
305
|
+
--text-3xl:calc(1.625rem * var(--type-scale, 1)); --leading-3xl:calc(1.95rem * var(--type-scale, 1)); /* 26px */
|
|
306
|
+
--text-4xl:calc(2rem * var(--type-scale, 1)); --leading-4xl:calc(2.25rem * var(--type-scale, 1)); /* 32px */
|
|
307
|
+
--text-5xl:calc(2.5rem * var(--type-scale, 1)); --leading-5xl:1.05; /* 40px */
|
|
308
|
+
--text-6xl:calc(3.25rem * var(--type-scale, 1)); --leading-6xl:1; /* 52px */
|
|
309
|
+
--text-7xl:calc(4rem * var(--type-scale, 1)); --leading-7xl:1; /* 64px */
|
|
310
|
+
--text-8xl:calc(5.25rem * var(--type-scale, 1)); --leading-8xl:1; /* 84px */
|
|
311
|
+
--text-9xl:calc(7rem * var(--type-scale, 1)); --leading-9xl:1; /* 112px */
|
|
306
312
|
|
|
307
313
|
/* The SAME scale under @hanzo/brand's spelling. @hanzo/gui's shell theme and
|
|
308
314
|
Hanzo Studio address the ramp as --font-size-*; both names are one value, so
|
|
@@ -367,7 +373,7 @@
|
|
|
367
373
|
form feels broken. pointer:coarse is the real signal — a desktop mouse keeps
|
|
368
374
|
the compact 13px field. */
|
|
369
375
|
@media (pointer:coarse){
|
|
370
|
-
:root{--text-control:1rem}
|
|
376
|
+
:root{--text-control:calc(1rem * var(--type-scale, 1))}
|
|
371
377
|
}
|
|
372
378
|
|
|
373
379
|
/* ── tokens/spacing.css ─────────────────────────────────────── */
|
|
@@ -375,21 +381,27 @@
|
|
|
375
381
|
declared in hanzo.ai's tailwind.config.ts (legacy v3 config, kept for
|
|
376
382
|
reference) — use it for editorial layouts, not for component padding. */
|
|
377
383
|
:root{
|
|
384
|
+
/* The density knob. 1 is the published spacing; every --space-* rung below
|
|
385
|
+
multiplies by it, and --grid-gap-* reference those rungs rather than
|
|
386
|
+
restating them, so gaps, padding and section rhythm move together.
|
|
387
|
+
@hanzo/design's `vars({density})` emits exactly this name. */
|
|
388
|
+
--density:1;
|
|
389
|
+
|
|
378
390
|
--space-0:0;
|
|
379
|
-
--space-1:0.25rem;
|
|
380
|
-
--space-2:0.5rem;
|
|
381
|
-
--space-3:0.75rem;
|
|
382
|
-
--space-4:1rem;
|
|
383
|
-
--space-5:1.25rem;
|
|
384
|
-
--space-6:1.5rem;
|
|
385
|
-
--space-8:2rem;
|
|
386
|
-
--space-10:2.5rem;
|
|
387
|
-
--space-12:3rem;
|
|
388
|
-
--space-14:3.5rem;
|
|
389
|
-
--space-16:4rem;
|
|
390
|
-
--space-20:5rem;
|
|
391
|
-
--space-24:6rem;
|
|
392
|
-
--space-32:8rem;
|
|
391
|
+
--space-1:calc(0.25rem * var(--density, 1));
|
|
392
|
+
--space-2:calc(0.5rem * var(--density, 1));
|
|
393
|
+
--space-3:calc(0.75rem * var(--density, 1));
|
|
394
|
+
--space-4:calc(1rem * var(--density, 1));
|
|
395
|
+
--space-5:calc(1.25rem * var(--density, 1));
|
|
396
|
+
--space-6:calc(1.5rem * var(--density, 1));
|
|
397
|
+
--space-8:calc(2rem * var(--density, 1));
|
|
398
|
+
--space-10:calc(2.5rem * var(--density, 1));
|
|
399
|
+
--space-12:calc(3rem * var(--density, 1));
|
|
400
|
+
--space-14:calc(3.5rem * var(--density, 1));
|
|
401
|
+
--space-16:calc(4rem * var(--density, 1));
|
|
402
|
+
--space-20:calc(5rem * var(--density, 1));
|
|
403
|
+
--space-24:calc(6rem * var(--density, 1));
|
|
404
|
+
--space-32:calc(8rem * var(--density, 1));
|
|
393
405
|
|
|
394
406
|
/* golden ramp (φ) — hanzo.ai tailwind.config.ts */
|
|
395
407
|
--golden-1:0.25rem;
|
|
@@ -822,19 +834,26 @@
|
|
|
822
834
|
padding:0 var(--space-3);
|
|
823
835
|
}
|
|
824
836
|
:where(textarea){padding:var(--space-2) var(--space-3);resize:vertical}
|
|
825
|
-
/*
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
837
|
+
/* A field has NO focus rule of its own — see the ring at the bottom of this
|
|
838
|
+
layer, which is the one focus indicator for everything.
|
|
839
|
+
|
|
840
|
+
There used to be one here: `outline:none` plus a brightened edge (.15 ->
|
|
841
|
+
.22) plus a soft halo, the composer look. It was removed because it could
|
|
842
|
+
not do the job in either of the two ways that matter.
|
|
843
|
+
|
|
844
|
+
It was never VISIBLE ENOUGH. Composited on --background the brightened edge
|
|
845
|
+
measures 1.91:1 and the halo 1.25:1, against the 3:1 that WCAG 1.4.11 asks
|
|
846
|
+
of a focus indicator and that this package already gates --ring on. The
|
|
847
|
+
budget was documented as being spent entirely on --ring "because that is
|
|
848
|
+
what a keyboard user navigates by" — true for a button, and false for a
|
|
849
|
+
field for exactly as long as this rule told fields not to use it.
|
|
850
|
+
|
|
851
|
+
And it was SUPPRESSIBLE. It carried the indicator on `border-color`, so any
|
|
852
|
+
app that states `border` on its own fields overrode it — @hanzo/id does,
|
|
853
|
+
unlayered, which beats this layer whatever its specificity, and its focused
|
|
854
|
+
fields sat at the resting .15 while both files read as correct. An outline
|
|
855
|
+
is not a border: nothing in an app's field styling reaches it, so the ring
|
|
856
|
+
paints whether or not the app has opinions about edges. */
|
|
838
857
|
:where(input,select,textarea):hover:not(:focus-visible):not(:disabled){background:var(--surface-3)}
|
|
839
858
|
:where(input,textarea)::placeholder{color:var(--text-disabled)}
|
|
840
859
|
:where(input,select,textarea,button):disabled{opacity:.5;cursor:not-allowed}
|
|
@@ -874,6 +893,19 @@
|
|
|
874
893
|
}
|
|
875
894
|
}
|
|
876
895
|
|
|
896
|
+
/* THE focus indicator. One rule, every focusable thing, no exceptions — a
|
|
897
|
+
button, a link, a summary, a field. 2px at --ring is 3.77:1 on the darkest
|
|
898
|
+
canvas and clears the 2px perimeter WCAG 2.4.13 asks for; the gate in
|
|
899
|
+
check-tokens holds --ring to that and nothing else here may weaken it.
|
|
900
|
+
|
|
901
|
+
There were two rules until 0.4.9, and they collided invisibly. Both computed
|
|
902
|
+
to (0,1,0) — :where() zeroes whatever it wraps, leaving one pseudo-class on
|
|
903
|
+
each side — so the cascade fell through to SOURCE ORDER inside this layer,
|
|
904
|
+
this rule was written later, and it overrode the `outline:none` the field
|
|
905
|
+
rule stated expressly to prevent it. Every focused input on every consumer
|
|
906
|
+
drew BOTH the ring and the edge+halo. Each rule read as correct alone, which
|
|
907
|
+
is why it survived review in both files; the defect existed only in their
|
|
908
|
+
order. One rule cannot disagree with itself. */
|
|
877
909
|
:focus-visible{outline:2px solid var(--ring);outline-offset:2px}
|
|
878
910
|
/* --white-20 is white-on-white in the light theme, so selection reads through
|
|
879
911
|
--selection, which BOTH themes define. */
|
|
@@ -1271,3 +1303,120 @@
|
|
|
1271
1303
|
[data-slot="rows"] > * + * {
|
|
1272
1304
|
border-top: 1px solid var(--borderColor, var(--border));
|
|
1273
1305
|
}
|
|
1306
|
+
|
|
1307
|
+
/* ── The composer prism — the ONE ring on any Hanzo surface ──────────────────
|
|
1308
|
+
The composer is where you talk to Hanzo, so it is the thing that should look
|
|
1309
|
+
alive, and it earns that with MOTION and LIGHT rather than hue. Every other
|
|
1310
|
+
pixel of chrome stays monochrome; there is no second exemption, and the two
|
|
1311
|
+
attempts to grant one (a violet ring, then a full-wheel rainbow) each made
|
|
1312
|
+
the surface wearing it the only colour in the product.
|
|
1313
|
+
|
|
1314
|
+
THIS LIVES HERE BECAUSE IT WAS DECLARED TWICE AND DRIFTED. hanzo.chat's
|
|
1315
|
+
client/src/style.css and hanzo.app's assets/globals.css each carried a copy,
|
|
1316
|
+
each calling itself "the ONE prism on any Hanzo surface". chat fixed the ring
|
|
1317
|
+
to be a rim; hanzo.app's copy kept drawing a filled DISC and never got the
|
|
1318
|
+
fix — invisible until a glass panel sat in it, at which point the whole
|
|
1319
|
+
spectrum washed up through the composer's interior. chat also quieted the
|
|
1320
|
+
halo (0.5 with a pulse -> 0.22, no pulse); hanzo.app kept the loud one. Two
|
|
1321
|
+
copies of one look is how that happens, and neither app could see the other
|
|
1322
|
+
was wrong.
|
|
1323
|
+
|
|
1324
|
+
Structure: `.hz-composer` is a 1.5px-padded host; its direct child is the
|
|
1325
|
+
panel. ::before is the ring, ::after the halo. Both are MASKED to exclude the
|
|
1326
|
+
panel's footprint, so the ring is a rim BY CONSTRUCTION and the panel is free
|
|
1327
|
+
to be any material — opaque, glass, anything. The stops are declared once and
|
|
1328
|
+
read by both, because duplicated they drift on the first palette change and
|
|
1329
|
+
nobody notices which half moved. */
|
|
1330
|
+
|
|
1331
|
+
/* `@property` is what lets a conic angle animate. Where it is unsupported the
|
|
1332
|
+
ring is simply static, which is a fine floor. */
|
|
1333
|
+
@property --hz-angle {
|
|
1334
|
+
syntax: "<angle>";
|
|
1335
|
+
initial-value: 0deg;
|
|
1336
|
+
inherits: false;
|
|
1337
|
+
}
|
|
1338
|
+
|
|
1339
|
+
:root {
|
|
1340
|
+
/* One sweep, closing on the stop it opened with — a conic gradient whose
|
|
1341
|
+
first and last stop differ shows a hard seam. */
|
|
1342
|
+
--hz-spectrum: rgba(8, 148, 255, 0.45), rgba(201, 89, 221, 0.48),
|
|
1343
|
+
rgba(255, 46, 84, 0.4), rgba(255, 144, 4, 0.4), rgba(8, 148, 255, 0.45);
|
|
1344
|
+
}
|
|
1345
|
+
|
|
1346
|
+
@keyframes hzComposerSpin {
|
|
1347
|
+
to {
|
|
1348
|
+
--hz-angle: 360deg;
|
|
1349
|
+
}
|
|
1350
|
+
}
|
|
1351
|
+
|
|
1352
|
+
.hz-composer {
|
|
1353
|
+
position: relative;
|
|
1354
|
+
isolation: isolate;
|
|
1355
|
+
padding: 1.5px;
|
|
1356
|
+
}
|
|
1357
|
+
|
|
1358
|
+
/* The ring DRAWS A RING. `padding` is its thickness; the two-layer mask keeps
|
|
1359
|
+
paint outside it — `content-box` is the hole, the full box the plate, and
|
|
1360
|
+
`exclude` leaves the lip. */
|
|
1361
|
+
.hz-composer::before {
|
|
1362
|
+
content: "";
|
|
1363
|
+
position: absolute;
|
|
1364
|
+
inset: 0;
|
|
1365
|
+
padding: 1.5px;
|
|
1366
|
+
border-radius: inherit;
|
|
1367
|
+
background: conic-gradient(from var(--hz-angle), var(--hz-spectrum));
|
|
1368
|
+
animation: hzComposerSpin 10s linear infinite;
|
|
1369
|
+
-webkit-mask:
|
|
1370
|
+
linear-gradient(#000 0 0) content-box,
|
|
1371
|
+
linear-gradient(#000 0 0);
|
|
1372
|
+
mask:
|
|
1373
|
+
linear-gradient(#000 0 0) content-box,
|
|
1374
|
+
linear-gradient(#000 0 0);
|
|
1375
|
+
mask-composite: exclude;
|
|
1376
|
+
/* After the standard shorthand: WebKit aliases `mask` onto `-webkit-mask`, so
|
|
1377
|
+
declaring this first lets the shorthand reset it to `source-over` — the
|
|
1378
|
+
filled disc again, on exactly the browsers too old to have `mask-composite`
|
|
1379
|
+
at all. */
|
|
1380
|
+
-webkit-mask-composite: xor;
|
|
1381
|
+
z-index: 0;
|
|
1382
|
+
pointer-events: none;
|
|
1383
|
+
}
|
|
1384
|
+
|
|
1385
|
+
/* The halo lights the air AROUND the box and nothing behind it. */
|
|
1386
|
+
.hz-composer::after {
|
|
1387
|
+
content: "";
|
|
1388
|
+
position: absolute;
|
|
1389
|
+
inset: -6px;
|
|
1390
|
+
padding: 6px;
|
|
1391
|
+
/* Concentric with the box, NOT `inherit`: the halo lives 6px outside, so an
|
|
1392
|
+
inherited corner on this larger box curves too tight and reads as a second,
|
|
1393
|
+
mismatched rounding just outside the panel. */
|
|
1394
|
+
border-radius: calc(1.5rem + 6px);
|
|
1395
|
+
background: conic-gradient(from var(--hz-angle), var(--hz-spectrum));
|
|
1396
|
+
filter: blur(16px);
|
|
1397
|
+
opacity: 0.22;
|
|
1398
|
+
animation: hzComposerSpin 10s linear infinite;
|
|
1399
|
+
-webkit-mask:
|
|
1400
|
+
linear-gradient(#000 0 0) content-box,
|
|
1401
|
+
linear-gradient(#000 0 0);
|
|
1402
|
+
mask:
|
|
1403
|
+
linear-gradient(#000 0 0) content-box,
|
|
1404
|
+
linear-gradient(#000 0 0);
|
|
1405
|
+
mask-composite: exclude;
|
|
1406
|
+
-webkit-mask-composite: xor;
|
|
1407
|
+
z-index: -1;
|
|
1408
|
+
pointer-events: none;
|
|
1409
|
+
}
|
|
1410
|
+
|
|
1411
|
+
/* The panel sits above ring and halo. */
|
|
1412
|
+
.hz-composer > * {
|
|
1413
|
+
position: relative;
|
|
1414
|
+
z-index: 1;
|
|
1415
|
+
}
|
|
1416
|
+
|
|
1417
|
+
@media (prefers-reduced-motion: reduce) {
|
|
1418
|
+
.hz-composer::before,
|
|
1419
|
+
.hz-composer::after {
|
|
1420
|
+
animation: none;
|
|
1421
|
+
}
|
|
1422
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hanzo/ui",
|
|
3
|
-
"version": "8.0.
|
|
3
|
+
"version": "8.0.69",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Hanzo UI — the one canonical Hanzo component library, on @hanzo/gui + @hanzo/design. ONE substrate: every component renders through @hanzo/gui primitives, so the same import works on web, native (expo) and desktop (Tauri). Self-contained (theme.css), presentational, host-agnostic, clean-room.",
|
|
6
6
|
"exports": {
|
|
@@ -187,7 +187,7 @@
|
|
|
187
187
|
"dist"
|
|
188
188
|
],
|
|
189
189
|
"dependencies": {
|
|
190
|
-
"@hanzo/design": "^0.4.
|
|
190
|
+
"@hanzo/design": "^0.4.11",
|
|
191
191
|
"@hanzo/logo": "^1.0.13",
|
|
192
192
|
"@hanzo/products": "^0.2.0",
|
|
193
193
|
"@hanzogui/lucide-icons-2": "^8.1.0",
|