@ceebee/ui 1.1.1 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client.d.ts +21 -1
- package/dist/client.js +151 -6
- package/dist/styles.css +129 -0
- package/package.json +1 -1
package/dist/client.d.ts
CHANGED
|
@@ -309,4 +309,24 @@ declare const StickerGroup: typeof StickerGroupRoot & {
|
|
|
309
309
|
Skeleton: typeof StickerGroupSkeleton;
|
|
310
310
|
};
|
|
311
311
|
|
|
312
|
-
|
|
312
|
+
interface PanZoomCanvasSkeletonProps {
|
|
313
|
+
label?: string;
|
|
314
|
+
}
|
|
315
|
+
declare function PanZoomCanvasSkeleton({ label }: PanZoomCanvasSkeletonProps): react.JSX.Element;
|
|
316
|
+
|
|
317
|
+
interface PanZoomCanvasProps {
|
|
318
|
+
label: string;
|
|
319
|
+
children: ReactNode;
|
|
320
|
+
hint?: string;
|
|
321
|
+
zoomInLabel?: string;
|
|
322
|
+
zoomOutLabel?: string;
|
|
323
|
+
resetLabel?: string;
|
|
324
|
+
zoomStatusLabel?: string;
|
|
325
|
+
motion?: boolean;
|
|
326
|
+
}
|
|
327
|
+
declare function PanZoomCanvasRoot({ label, children, hint, zoomInLabel, zoomOutLabel, resetLabel, zoomStatusLabel, motion: motionEnabled, }: PanZoomCanvasProps): react.JSX.Element;
|
|
328
|
+
declare const PanZoomCanvas: typeof PanZoomCanvasRoot & {
|
|
329
|
+
Skeleton: typeof PanZoomCanvasSkeleton;
|
|
330
|
+
};
|
|
331
|
+
|
|
332
|
+
export { Checklist, type ChecklistProps, type ChecklistTask, type Command, CommandPalette, type CommandPaletteProps, DEFAULT_LABELS, type DurationToken, type Labels, LabelsProvider, type LabelsProviderProps, type MotionHelpers, MotionProvider, type MotionProviderProps, type MotionSettings, type NavItem, type NavSection, type PaletteCommand, PanZoomCanvas, type PanZoomCanvasProps, type PanZoomCanvasSkeletonProps, type RankedCommand, Reveal, type RevealProps, Sidebar, type SidebarProps, type SpringPreset, Stagger, type StaggerProps, StickerGroup, type StickerGroupProps, type StickerGroupSkeletonProps, type StickerItem, ThemeBridge, type ThemeBridgeProps, type ThemeChoice, ThemeProvider, type ToastOptions, type ToastPosition, ToastProvider, type ToastProviderProps, TopBar, type TopBarProps, filterCommands, groupCommands, rankCommand, useLabels, useMotionSettings, useTheme, useToast };
|
package/dist/client.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { theme, ConfigProvider, Progress } from 'antd';
|
|
2
|
+
import { Button, theme, ConfigProvider, Progress } from 'antd';
|
|
3
3
|
export * from 'antd';
|
|
4
|
-
import { createContext, useContext, useMemo,
|
|
4
|
+
import { createContext, useState, useRef, useContext, useMemo, useCallback, useEffect, Children } from 'react';
|
|
5
5
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
6
6
|
export { default as enUSLocale } from 'antd/locale/en_US.js';
|
|
7
7
|
export { default as enUSDatePickerLocale } from 'antd/lib/date-picker/locale/en_US.js';
|
|
8
8
|
export { default as idIDLocale } from 'antd/locale/id_ID.js';
|
|
9
9
|
export { default as zhCNLocale } from 'antd/locale/zh_CN.js';
|
|
10
10
|
import { Dialog } from '@base-ui/react/dialog';
|
|
11
|
-
import { X, Search, Check, ChevronRight, PanelLeftOpen, PanelLeftClose, Info, XCircle, AlertTriangle, CheckCircle2 } from 'lucide-react';
|
|
11
|
+
import { X, Minus, Plus, RotateCcw, Search, Check, ChevronRight, PanelLeftOpen, PanelLeftClose, Info, XCircle, AlertTriangle, CheckCircle2 } from 'lucide-react';
|
|
12
12
|
import { Toast } from '@base-ui/react/toast';
|
|
13
13
|
import { Popover } from '@base-ui/react/popover';
|
|
14
14
|
import { AnimatePresence, motion } from 'motion/react';
|
|
@@ -572,14 +572,14 @@ var OFFSETS = {
|
|
|
572
572
|
function Reveal({
|
|
573
573
|
children,
|
|
574
574
|
from = "below",
|
|
575
|
-
distance = 12,
|
|
575
|
+
distance: distance2 = 12,
|
|
576
576
|
delay = 0,
|
|
577
577
|
spring = "soft",
|
|
578
578
|
onView = false,
|
|
579
579
|
className
|
|
580
580
|
}) {
|
|
581
581
|
const { enabled, spring: transition } = useMotionSettings();
|
|
582
|
-
const offset = enabled ? OFFSETS[from](
|
|
582
|
+
const offset = enabled ? OFFSETS[from](distance2) : {};
|
|
583
583
|
const hidden = { opacity: 0, ...offset };
|
|
584
584
|
const shown = { opacity: 1, x: 0, y: 0 };
|
|
585
585
|
return /* @__PURE__ */ jsx(
|
|
@@ -670,5 +670,150 @@ function StickerGroupRoot({
|
|
|
670
670
|
}) }) });
|
|
671
671
|
}
|
|
672
672
|
var StickerGroup = Object.assign(StickerGroupRoot, { Skeleton: StickerGroupSkeleton });
|
|
673
|
+
function PanZoomCanvasSkeleton({ label = "Loading canvas" }) {
|
|
674
|
+
return /* @__PURE__ */ jsxs("div", { className: "cb-pan-zoom-canvas cb-pan-zoom-canvas--skeleton", role: "status", "aria-label": label, children: [
|
|
675
|
+
/* @__PURE__ */ jsx("span", { className: "cb-pan-zoom-canvas__skeleton-controls", "aria-hidden": "true" }),
|
|
676
|
+
/* @__PURE__ */ jsx("span", { className: "cb-pan-zoom-canvas__skeleton-node cb-pan-zoom-canvas__skeleton-node--start", "aria-hidden": "true" }),
|
|
677
|
+
/* @__PURE__ */ jsx("span", { className: "cb-pan-zoom-canvas__skeleton-line", "aria-hidden": "true" }),
|
|
678
|
+
/* @__PURE__ */ jsx("span", { className: "cb-pan-zoom-canvas__skeleton-node cb-pan-zoom-canvas__skeleton-node--end", "aria-hidden": "true" })
|
|
679
|
+
] });
|
|
680
|
+
}
|
|
681
|
+
var MIN_SCALE = 0.5;
|
|
682
|
+
var MAX_SCALE = 2;
|
|
683
|
+
var SCALE_STEP = 0.25;
|
|
684
|
+
function clampScale(value) {
|
|
685
|
+
return Math.min(MAX_SCALE, Math.max(MIN_SCALE, value));
|
|
686
|
+
}
|
|
687
|
+
function distance([first, second]) {
|
|
688
|
+
return Math.hypot(second.x - first.x, second.y - first.y);
|
|
689
|
+
}
|
|
690
|
+
function PanZoomCanvasRoot({
|
|
691
|
+
label,
|
|
692
|
+
children,
|
|
693
|
+
hint,
|
|
694
|
+
zoomInLabel = "Zoom in",
|
|
695
|
+
zoomOutLabel = "Zoom out",
|
|
696
|
+
resetLabel = "Reset canvas",
|
|
697
|
+
zoomStatusLabel = "Canvas zoom",
|
|
698
|
+
motion: motionEnabled = true
|
|
699
|
+
}) {
|
|
700
|
+
const motionSettings = useMotionSettings();
|
|
701
|
+
const [pan, setPan] = useState({ x: 0, y: 0 });
|
|
702
|
+
const [scale, setScale] = useState(1);
|
|
703
|
+
const pointers = useRef(/* @__PURE__ */ new Map());
|
|
704
|
+
const dragOrigin = useRef(null);
|
|
705
|
+
const pinchOrigin = useRef(null);
|
|
706
|
+
const stepRef = useRef(null);
|
|
707
|
+
const shouldAnimate = motionEnabled && motionSettings.enabled;
|
|
708
|
+
function reset() {
|
|
709
|
+
setPan({ x: 0, y: 0 });
|
|
710
|
+
setScale(1);
|
|
711
|
+
}
|
|
712
|
+
function zoom(delta) {
|
|
713
|
+
setScale((current) => clampScale(current + delta));
|
|
714
|
+
}
|
|
715
|
+
function onKeyDown(event) {
|
|
716
|
+
const movement = {
|
|
717
|
+
ArrowLeft: { x: -1, y: 0 },
|
|
718
|
+
ArrowRight: { x: 1, y: 0 },
|
|
719
|
+
ArrowUp: { x: 0, y: -1 },
|
|
720
|
+
ArrowDown: { x: 0, y: 1 }
|
|
721
|
+
};
|
|
722
|
+
if (movement[event.key]) {
|
|
723
|
+
event.preventDefault();
|
|
724
|
+
setPan((current) => ({ x: current.x + movement[event.key].x, y: current.y + movement[event.key].y }));
|
|
725
|
+
return;
|
|
726
|
+
}
|
|
727
|
+
if (event.key === "+" || event.key === "=") {
|
|
728
|
+
event.preventDefault();
|
|
729
|
+
zoom(SCALE_STEP);
|
|
730
|
+
}
|
|
731
|
+
if (event.key === "-") {
|
|
732
|
+
event.preventDefault();
|
|
733
|
+
zoom(-SCALE_STEP);
|
|
734
|
+
}
|
|
735
|
+
if (event.key === "0" || event.key === "Home") {
|
|
736
|
+
event.preventDefault();
|
|
737
|
+
reset();
|
|
738
|
+
}
|
|
739
|
+
}
|
|
740
|
+
function onPointerDown(event) {
|
|
741
|
+
if (event.target.closest("a, button, input, select, textarea")) return;
|
|
742
|
+
event.currentTarget.setPointerCapture?.(event.pointerId);
|
|
743
|
+
pointers.current.set(event.pointerId, { x: event.clientX, y: event.clientY });
|
|
744
|
+
const points = [...pointers.current.values()];
|
|
745
|
+
if (points.length === 1) dragOrigin.current = { point: points[0], pan };
|
|
746
|
+
if (points.length === 2) pinchOrigin.current = { distance: distance(points), scale };
|
|
747
|
+
}
|
|
748
|
+
function onPointerMove(event) {
|
|
749
|
+
if (!pointers.current.has(event.pointerId)) return;
|
|
750
|
+
pointers.current.set(event.pointerId, { x: event.clientX, y: event.clientY });
|
|
751
|
+
const points = [...pointers.current.values()];
|
|
752
|
+
if (points.length === 2 && pinchOrigin.current) {
|
|
753
|
+
const nextDistance = distance(points);
|
|
754
|
+
setScale(clampScale(pinchOrigin.current.scale * (nextDistance / pinchOrigin.current.distance)));
|
|
755
|
+
return;
|
|
756
|
+
}
|
|
757
|
+
if (points.length === 1 && dragOrigin.current) {
|
|
758
|
+
const step = stepRef.current?.getBoundingClientRect().width || 1;
|
|
759
|
+
setPan({
|
|
760
|
+
x: dragOrigin.current.pan.x + (points[0].x - dragOrigin.current.point.x) / step,
|
|
761
|
+
y: dragOrigin.current.pan.y + (points[0].y - dragOrigin.current.point.y) / step
|
|
762
|
+
});
|
|
763
|
+
}
|
|
764
|
+
}
|
|
765
|
+
function releasePointer(event) {
|
|
766
|
+
pointers.current.delete(event.pointerId);
|
|
767
|
+
pinchOrigin.current = null;
|
|
768
|
+
const remaining = [...pointers.current.values()];
|
|
769
|
+
dragOrigin.current = remaining.length === 1 ? { point: remaining[0], pan } : null;
|
|
770
|
+
}
|
|
771
|
+
function onWheel(event) {
|
|
772
|
+
if (!event.ctrlKey && !event.metaKey) return;
|
|
773
|
+
event.preventDefault();
|
|
774
|
+
zoom(event.deltaY < 0 ? SCALE_STEP : -SCALE_STEP);
|
|
775
|
+
}
|
|
776
|
+
const transformStyle = {
|
|
777
|
+
"--cb-pan-zoom-x": pan.x,
|
|
778
|
+
"--cb-pan-zoom-y": pan.y,
|
|
779
|
+
"--cb-pan-zoom-scale": scale
|
|
780
|
+
};
|
|
781
|
+
return /* @__PURE__ */ jsxs("section", { className: "cb-pan-zoom-canvas", "data-motion": String(shouldAnimate), children: [
|
|
782
|
+
/* @__PURE__ */ jsxs("div", { className: "cb-pan-zoom-canvas__toolbar", children: [
|
|
783
|
+
hint ? /* @__PURE__ */ jsx("p", { className: "cb-pan-zoom-canvas__hint", children: hint }) : /* @__PURE__ */ jsx("span", {}),
|
|
784
|
+
/* @__PURE__ */ jsxs("div", { className: "cb-pan-zoom-canvas__controls", children: [
|
|
785
|
+
/* @__PURE__ */ jsx(Button, { type: "text", size: "small", icon: /* @__PURE__ */ jsx(Minus, { "aria-hidden": "true" }), "aria-label": zoomOutLabel, onClick: () => zoom(-SCALE_STEP), disabled: scale <= MIN_SCALE }),
|
|
786
|
+
/* @__PURE__ */ jsxs("output", { className: "cb-pan-zoom-canvas__zoom", "aria-label": zoomStatusLabel, children: [
|
|
787
|
+
Math.round(scale * 100),
|
|
788
|
+
"%"
|
|
789
|
+
] }),
|
|
790
|
+
/* @__PURE__ */ jsx(Button, { type: "text", size: "small", icon: /* @__PURE__ */ jsx(Plus, { "aria-hidden": "true" }), "aria-label": zoomInLabel, onClick: () => zoom(SCALE_STEP), disabled: scale >= MAX_SCALE }),
|
|
791
|
+
/* @__PURE__ */ jsx(Button, { type: "text", size: "small", icon: /* @__PURE__ */ jsx(RotateCcw, { "aria-hidden": "true" }), "aria-label": resetLabel, onClick: reset })
|
|
792
|
+
] })
|
|
793
|
+
] }),
|
|
794
|
+
/* @__PURE__ */ jsxs(
|
|
795
|
+
"div",
|
|
796
|
+
{
|
|
797
|
+
className: "cb-pan-zoom-canvas__viewport",
|
|
798
|
+
role: "region",
|
|
799
|
+
"aria-label": label,
|
|
800
|
+
tabIndex: 0,
|
|
801
|
+
"data-pan-x": pan.x,
|
|
802
|
+
"data-pan-y": pan.y,
|
|
803
|
+
onKeyDown,
|
|
804
|
+
onPointerDown,
|
|
805
|
+
onPointerMove,
|
|
806
|
+
onPointerUp: releasePointer,
|
|
807
|
+
onPointerCancel: releasePointer,
|
|
808
|
+
onWheel,
|
|
809
|
+
children: [
|
|
810
|
+
/* @__PURE__ */ jsx("span", { ref: stepRef, className: "cb-pan-zoom-canvas__step", "aria-hidden": "true" }),
|
|
811
|
+
/* @__PURE__ */ jsx("div", { className: "cb-pan-zoom-canvas__content", style: transformStyle, children })
|
|
812
|
+
]
|
|
813
|
+
}
|
|
814
|
+
)
|
|
815
|
+
] });
|
|
816
|
+
}
|
|
817
|
+
var PanZoomCanvas = Object.assign(PanZoomCanvasRoot, { Skeleton: PanZoomCanvasSkeleton });
|
|
673
818
|
|
|
674
|
-
export { Checklist, CommandPalette, DEFAULT_LABELS, LabelsProvider, MotionProvider, Reveal, Sidebar, Stagger, StickerGroup, ThemeBridge, ThemeProvider, ToastProvider, TopBar, filterCommands, groupCommands, rankCommand, useLabels, useMotionSettings, useTheme, useToast };
|
|
819
|
+
export { Checklist, CommandPalette, DEFAULT_LABELS, LabelsProvider, MotionProvider, PanZoomCanvas, Reveal, Sidebar, Stagger, StickerGroup, ThemeBridge, ThemeProvider, ToastProvider, TopBar, filterCommands, groupCommands, rankCommand, useLabels, useMotionSettings, useTheme, useToast };
|
package/dist/styles.css
CHANGED
|
@@ -41,6 +41,7 @@
|
|
|
41
41
|
--cb-control-height-sm: 2rem;
|
|
42
42
|
--cb-control-height-md: 2.5rem;
|
|
43
43
|
--cb-control-height-lg: 3rem;
|
|
44
|
+
--cb-canvas-block-size: 32rem;
|
|
44
45
|
|
|
45
46
|
--cb-sticker-enter-y: var(--cb-space-3);
|
|
46
47
|
--cb-sticker-exit-x: var(--cb-space-6);
|
|
@@ -918,6 +919,134 @@ html, body { background: var(--cb-bg); color: var(--cb-fg); }
|
|
|
918
919
|
object-fit: cover;
|
|
919
920
|
}
|
|
920
921
|
|
|
922
|
+
/* data/pan-zoom-canvas/pan-zoom-canvas.css */
|
|
923
|
+
.cb-pan-zoom-canvas {
|
|
924
|
+
background: var(--cb-surface);
|
|
925
|
+
border: var(--cb-border-width) solid var(--cb-border);
|
|
926
|
+
border-radius: var(--cb-radius-lg);
|
|
927
|
+
color: var(--cb-fg);
|
|
928
|
+
min-inline-size: 0;
|
|
929
|
+
overflow: hidden;
|
|
930
|
+
}
|
|
931
|
+
|
|
932
|
+
.cb-pan-zoom-canvas__toolbar {
|
|
933
|
+
align-items: center;
|
|
934
|
+
background: var(--cb-bg-subtle);
|
|
935
|
+
border-block-end: var(--cb-border-width) solid var(--cb-border);
|
|
936
|
+
display: flex;
|
|
937
|
+
gap: var(--cb-space-3);
|
|
938
|
+
justify-content: space-between;
|
|
939
|
+
min-block-size: var(--cb-control-height-lg);
|
|
940
|
+
padding: var(--cb-space-2) var(--cb-space-3);
|
|
941
|
+
}
|
|
942
|
+
|
|
943
|
+
.cb-pan-zoom-canvas__hint {
|
|
944
|
+
color: var(--cb-fg-muted);
|
|
945
|
+
font-size: var(--cb-text-xs);
|
|
946
|
+
margin: 0;
|
|
947
|
+
}
|
|
948
|
+
|
|
949
|
+
.cb-pan-zoom-canvas__controls {
|
|
950
|
+
align-items: center;
|
|
951
|
+
display: flex;
|
|
952
|
+
gap: var(--cb-space-1);
|
|
953
|
+
}
|
|
954
|
+
|
|
955
|
+
.cb-pan-zoom-canvas__controls svg {
|
|
956
|
+
block-size: var(--cb-text-md);
|
|
957
|
+
inline-size: var(--cb-text-md);
|
|
958
|
+
}
|
|
959
|
+
|
|
960
|
+
.cb-pan-zoom-canvas__zoom {
|
|
961
|
+
color: var(--cb-fg-muted);
|
|
962
|
+
font-size: var(--cb-text-xs);
|
|
963
|
+
font-variant-numeric: tabular-nums;
|
|
964
|
+
min-inline-size: var(--cb-control-height-md);
|
|
965
|
+
text-align: center;
|
|
966
|
+
}
|
|
967
|
+
|
|
968
|
+
.cb-pan-zoom-canvas__viewport {
|
|
969
|
+
block-size: var(--cb-canvas-block-size);
|
|
970
|
+
cursor: grab;
|
|
971
|
+
overflow: hidden;
|
|
972
|
+
position: relative;
|
|
973
|
+
touch-action: none;
|
|
974
|
+
}
|
|
975
|
+
|
|
976
|
+
.cb-pan-zoom-canvas__viewport:active { cursor: grabbing; }
|
|
977
|
+
|
|
978
|
+
.cb-pan-zoom-canvas__viewport:focus-visible {
|
|
979
|
+
outline: var(--cb-focus-width) solid var(--cb-focus);
|
|
980
|
+
outline-offset: var(--cb-focus-offset-inset);
|
|
981
|
+
}
|
|
982
|
+
|
|
983
|
+
.cb-pan-zoom-canvas__step {
|
|
984
|
+
inline-size: var(--cb-space-5);
|
|
985
|
+
pointer-events: none;
|
|
986
|
+
position: absolute;
|
|
987
|
+
visibility: hidden;
|
|
988
|
+
}
|
|
989
|
+
|
|
990
|
+
.cb-pan-zoom-canvas__content {
|
|
991
|
+
min-block-size: 100%;
|
|
992
|
+
min-inline-size: 100%;
|
|
993
|
+
transform: translate(
|
|
994
|
+
calc(var(--cb-space-5) * var(--cb-pan-zoom-x)),
|
|
995
|
+
calc(var(--cb-space-5) * var(--cb-pan-zoom-y))
|
|
996
|
+
) scale(var(--cb-pan-zoom-scale));
|
|
997
|
+
transform-origin: center;
|
|
998
|
+
}
|
|
999
|
+
|
|
1000
|
+
.cb-pan-zoom-canvas[data-motion="true"] .cb-pan-zoom-canvas__content {
|
|
1001
|
+
transition: transform var(--cb-duration-base) var(--cb-ease-standard);
|
|
1002
|
+
}
|
|
1003
|
+
|
|
1004
|
+
.cb-pan-zoom-canvas--skeleton {
|
|
1005
|
+
block-size: var(--cb-canvas-block-size);
|
|
1006
|
+
position: relative;
|
|
1007
|
+
}
|
|
1008
|
+
|
|
1009
|
+
.cb-pan-zoom-canvas__skeleton-controls,
|
|
1010
|
+
.cb-pan-zoom-canvas__skeleton-node,
|
|
1011
|
+
.cb-pan-zoom-canvas__skeleton-line {
|
|
1012
|
+
background: var(--cb-bg-subtle);
|
|
1013
|
+
display: block;
|
|
1014
|
+
position: absolute;
|
|
1015
|
+
}
|
|
1016
|
+
|
|
1017
|
+
.cb-pan-zoom-canvas__skeleton-controls {
|
|
1018
|
+
block-size: var(--cb-control-height-sm);
|
|
1019
|
+
border-radius: var(--cb-radius-sm);
|
|
1020
|
+
inline-size: calc(var(--cb-space-8) * 2);
|
|
1021
|
+
inset-block-start: var(--cb-space-3);
|
|
1022
|
+
inset-inline-end: var(--cb-space-3);
|
|
1023
|
+
}
|
|
1024
|
+
|
|
1025
|
+
.cb-pan-zoom-canvas__skeleton-node {
|
|
1026
|
+
block-size: var(--cb-control-height-lg);
|
|
1027
|
+
border-radius: var(--cb-radius-md);
|
|
1028
|
+
inline-size: calc(var(--cb-space-8) * 2);
|
|
1029
|
+
inset-block-start: 50%;
|
|
1030
|
+
}
|
|
1031
|
+
|
|
1032
|
+
.cb-pan-zoom-canvas__skeleton-node--start { inset-inline-start: var(--cb-space-6); }
|
|
1033
|
+
.cb-pan-zoom-canvas__skeleton-node--end { inset-inline-end: var(--cb-space-6); }
|
|
1034
|
+
|
|
1035
|
+
.cb-pan-zoom-canvas__skeleton-line {
|
|
1036
|
+
block-size: var(--cb-border-width);
|
|
1037
|
+
inset-block-start: calc(50% + var(--cb-space-3));
|
|
1038
|
+
inset-inline: calc(var(--cb-space-8) * 3);
|
|
1039
|
+
}
|
|
1040
|
+
|
|
1041
|
+
@media (prefers-reduced-motion: reduce) {
|
|
1042
|
+
.cb-pan-zoom-canvas__content { transition: none; }
|
|
1043
|
+
}
|
|
1044
|
+
|
|
1045
|
+
@media (forced-colors: active) {
|
|
1046
|
+
.cb-pan-zoom-canvas,
|
|
1047
|
+
.cb-pan-zoom-canvas__toolbar { border-color: CanvasText; }
|
|
1048
|
+
}
|
|
1049
|
+
|
|
921
1050
|
/* data/sticker-group/sticker-group.css */
|
|
922
1051
|
.cb-sticker-group {
|
|
923
1052
|
display: flex;
|