@activecollab/components 2.0.408 → 2.0.409
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/cjs/components/Icons/collection/Project.js +98 -0
- package/dist/cjs/components/Icons/collection/Project.js.map +1 -0
- package/dist/cjs/components/Icons/collection/Task.js +61 -0
- package/dist/cjs/components/Icons/collection/Task.js.map +1 -0
- package/dist/cjs/components/Icons/collection/index.js +14 -0
- package/dist/cjs/components/Icons/collection/index.js.map +1 -1
- package/dist/cjs/presentation/stackedCard/content/NoteCard.js +7 -3
- package/dist/cjs/presentation/stackedCard/content/NoteCard.js.map +1 -1
- package/dist/cjs/presentation/stackedCard/content/ProjectCard.js +136 -0
- package/dist/cjs/presentation/stackedCard/content/ProjectCard.js.map +1 -0
- package/dist/cjs/presentation/stackedCard/content/TaskCard.js +183 -56
- package/dist/cjs/presentation/stackedCard/content/TaskCard.js.map +1 -1
- package/dist/cjs/presentation/stackedCard/content/index.js +11 -0
- package/dist/cjs/presentation/stackedCard/content/index.js.map +1 -1
- package/dist/cjs/presentation/stackedCard/content/shared.js +66 -19
- package/dist/cjs/presentation/stackedCard/content/shared.js.map +1 -1
- package/dist/cjs/presentation/whiteboard/bottomDock.js +95 -32
- package/dist/cjs/presentation/whiteboard/bottomDock.js.map +1 -1
- package/dist/cjs/presentation/whiteboard/canvasElements.js +196 -8
- package/dist/cjs/presentation/whiteboard/canvasElements.js.map +1 -1
- package/dist/cjs/presentation/whiteboard/inspector.js +149 -47
- package/dist/cjs/presentation/whiteboard/inspector.js.map +1 -1
- package/dist/cjs/presentation/whiteboard/outline.js +91 -18
- package/dist/cjs/presentation/whiteboard/outline.js.map +1 -1
- package/dist/cjs/presentation/whiteboard/projectElements.js +883 -0
- package/dist/cjs/presentation/whiteboard/projectElements.js.map +1 -0
- package/dist/esm/components/Icons/collection/Project.d.ts +36 -0
- package/dist/esm/components/Icons/collection/Project.d.ts.map +1 -0
- package/dist/esm/components/Icons/collection/Project.js +91 -0
- package/dist/esm/components/Icons/collection/Project.js.map +1 -0
- package/dist/esm/components/Icons/collection/Task.d.ts +32 -0
- package/dist/esm/components/Icons/collection/Task.d.ts.map +1 -0
- package/dist/esm/components/Icons/collection/Task.js +54 -0
- package/dist/esm/components/Icons/collection/Task.js.map +1 -0
- package/dist/esm/components/Icons/collection/index.d.ts +2 -0
- package/dist/esm/components/Icons/collection/index.d.ts.map +1 -1
- package/dist/esm/components/Icons/collection/index.js +2 -0
- package/dist/esm/components/Icons/collection/index.js.map +1 -1
- package/dist/esm/presentation/stackedCard/content/NoteCard.d.ts +8 -1
- package/dist/esm/presentation/stackedCard/content/NoteCard.d.ts.map +1 -1
- package/dist/esm/presentation/stackedCard/content/NoteCard.js +8 -4
- package/dist/esm/presentation/stackedCard/content/NoteCard.js.map +1 -1
- package/dist/esm/presentation/stackedCard/content/ProjectCard.d.ts +64 -0
- package/dist/esm/presentation/stackedCard/content/ProjectCard.d.ts.map +1 -0
- package/dist/esm/presentation/stackedCard/content/ProjectCard.js +128 -0
- package/dist/esm/presentation/stackedCard/content/ProjectCard.js.map +1 -0
- package/dist/esm/presentation/stackedCard/content/TaskCard.d.ts +64 -2
- package/dist/esm/presentation/stackedCard/content/TaskCard.d.ts.map +1 -1
- package/dist/esm/presentation/stackedCard/content/TaskCard.js +181 -58
- package/dist/esm/presentation/stackedCard/content/TaskCard.js.map +1 -1
- package/dist/esm/presentation/stackedCard/content/index.d.ts +1 -0
- package/dist/esm/presentation/stackedCard/content/index.d.ts.map +1 -1
- package/dist/esm/presentation/stackedCard/content/index.js +1 -0
- package/dist/esm/presentation/stackedCard/content/index.js.map +1 -1
- package/dist/esm/presentation/stackedCard/content/shared.d.ts +30 -0
- package/dist/esm/presentation/stackedCard/content/shared.d.ts.map +1 -1
- package/dist/esm/presentation/stackedCard/content/shared.js +66 -19
- package/dist/esm/presentation/stackedCard/content/shared.js.map +1 -1
- package/dist/esm/presentation/whiteboard/bottomDock.d.ts +30 -7
- package/dist/esm/presentation/whiteboard/bottomDock.d.ts.map +1 -1
- package/dist/esm/presentation/whiteboard/bottomDock.js +79 -32
- package/dist/esm/presentation/whiteboard/bottomDock.js.map +1 -1
- package/dist/esm/presentation/whiteboard/canvasElements.d.ts +4 -1
- package/dist/esm/presentation/whiteboard/canvasElements.d.ts.map +1 -1
- package/dist/esm/presentation/whiteboard/canvasElements.js +158 -7
- package/dist/esm/presentation/whiteboard/canvasElements.js.map +1 -1
- package/dist/esm/presentation/whiteboard/inspector.d.ts +35 -1
- package/dist/esm/presentation/whiteboard/inspector.d.ts.map +1 -1
- package/dist/esm/presentation/whiteboard/inspector.js +170 -68
- package/dist/esm/presentation/whiteboard/inspector.js.map +1 -1
- package/dist/esm/presentation/whiteboard/outline.d.ts +23 -3
- package/dist/esm/presentation/whiteboard/outline.d.ts.map +1 -1
- package/dist/esm/presentation/whiteboard/outline.js +89 -18
- package/dist/esm/presentation/whiteboard/outline.js.map +1 -1
- package/dist/esm/presentation/whiteboard/projectElements.d.ts +267 -0
- package/dist/esm/presentation/whiteboard/projectElements.d.ts.map +1 -0
- package/dist/esm/presentation/whiteboard/projectElements.js +824 -0
- package/dist/esm/presentation/whiteboard/projectElements.js.map +1 -0
- package/dist/index.js +629 -490
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/package.json +1 -1
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.playControl = exports.coverManagement = exports.StyledFavicon = exports.StyledColorCover = exports.StyledClamp = exports.StyledChip = exports.Placeholder = exports.EntityDots = exports.COVER_RATIO_SWATCH = exports.COVER_RATIO_IMAGE = exports.COVER_RATIO_HERO = void 0;
|
|
6
|
+
exports.playControl = exports.coverManagement = exports.StyledTitleBlock = exports.StyledProjectLine = exports.StyledFavicon = exports.StyledColorCover = exports.StyledClamp = exports.StyledChip = exports.Placeholder = exports.EntityDots = exports.CardProjectLine = exports.COVER_RATIO_SWATCH = exports.COVER_RATIO_IMAGE = exports.COVER_RATIO_HERO = exports.CARD_FONT = void 0;
|
|
7
7
|
var _react = _interopRequireDefault(require("react"));
|
|
8
8
|
var _styledComponents = _interopRequireWildcard(require("styled-components"));
|
|
9
9
|
var _Icons = require("../../../components/Icons");
|
|
@@ -31,6 +31,20 @@ function _extends() { return _extends = Object.assign ? Object.assign.bind() : f
|
|
|
31
31
|
* the same words.
|
|
32
32
|
*/
|
|
33
33
|
|
|
34
|
+
/* ------------------------------------------------------------------ */
|
|
35
|
+
/* The font stack for raw text */
|
|
36
|
+
/* ------------------------------------------------------------------ */
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* There is no global CSS reset in this Storybook, so a raw element (a `<span>`
|
|
40
|
+
* holding a date, a `<button>` holding a word) falls back to the browser default
|
|
41
|
+
* — a SERIF face at the UA's own size. Anything that is not a DS `Typography`
|
|
42
|
+
* has to name the font itself. Use a DS Typography where one fits; use this
|
|
43
|
+
* where the app itself sets the size in CSS (the column card's date row is a
|
|
44
|
+
* plain `div` in `view.project_tasks_column_mode.less`, not a Typography).
|
|
45
|
+
*/
|
|
46
|
+
var CARD_FONT = exports.CARD_FONT = "-apple-system, BlinkMacSystemFont, \"Roboto\",\n \"Helvetica Neue\", Arial, sans-serif";
|
|
47
|
+
|
|
34
48
|
/* ------------------------------------------------------------------ */
|
|
35
49
|
/* Per-type cover ratios */
|
|
36
50
|
/* ------------------------------------------------------------------ */
|
|
@@ -101,27 +115,60 @@ var StyledClamp = exports.StyledClamp = (0, _styledComponents.default)(_Typograp
|
|
|
101
115
|
componentId: "sc-1x5md9a-1"
|
|
102
116
|
})(["display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;"]);
|
|
103
117
|
|
|
118
|
+
/**
|
|
119
|
+
* The title block — everything the title row stacks to the LEFT of the "…"
|
|
120
|
+
* menu. A card that only has a title puts the clamp straight in the row; a card
|
|
121
|
+
* that puts a line above or below it (the project a task belongs to, the client
|
|
122
|
+
* a project is for) stacks them here so the row keeps its two-child shape:
|
|
123
|
+
* text block, then the fixed-width menu.
|
|
124
|
+
*/
|
|
125
|
+
var StyledTitleBlock = exports.StyledTitleBlock = _styledComponents.default.div.withConfig({
|
|
126
|
+
displayName: "shared__StyledTitleBlock",
|
|
127
|
+
componentId: "sc-1x5md9a-2"
|
|
128
|
+
})(["display:flex;flex-direction:column;min-width:0;"]);
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* The project a card's entity lives in, above the title.
|
|
132
|
+
*
|
|
133
|
+
* On a canvas a task card has lost the column that used to say which project it
|
|
134
|
+
* came from, so the card says it itself. One line, one treatment, shared by
|
|
135
|
+
* every content type that can carry it (the whiteboard's own task face already
|
|
136
|
+
* wrote it this way: `Caption 2` tertiary, tight above the title, ellipsis on
|
|
137
|
+
* overflow — a project name is a reference, never a second title).
|
|
138
|
+
*/
|
|
139
|
+
var StyledProjectLine = exports.StyledProjectLine = (0, _styledComponents.default)(_Typography.Caption2).withConfig({
|
|
140
|
+
displayName: "shared__StyledProjectLine",
|
|
141
|
+
componentId: "sc-1x5md9a-3"
|
|
142
|
+
})(["display:block;margin-bottom:2px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;"]);
|
|
143
|
+
var CardProjectLine = exports.CardProjectLine = function CardProjectLine(_ref2) {
|
|
144
|
+
var children = _ref2.children;
|
|
145
|
+
return /*#__PURE__*/_react.default.createElement(StyledProjectLine, {
|
|
146
|
+
color: "tertiary",
|
|
147
|
+
className: "sc-project"
|
|
148
|
+
}, children);
|
|
149
|
+
};
|
|
150
|
+
|
|
104
151
|
/** A favicon square — a solid data colour stands in for the real favicon. */
|
|
105
152
|
var StyledFavicon = exports.StyledFavicon = _styledComponents.default.span.withConfig({
|
|
106
153
|
displayName: "shared__StyledFavicon",
|
|
107
|
-
componentId: "sc-1x5md9a-
|
|
108
|
-
})(["display:inline-flex;width:16px;height:16px;border-radius:4px;background:", ";flex-shrink:0;"], function (
|
|
109
|
-
var $bg =
|
|
154
|
+
componentId: "sc-1x5md9a-4"
|
|
155
|
+
})(["display:inline-flex;width:16px;height:16px;border-radius:4px;background:", ";flex-shrink:0;"], function (_ref3) {
|
|
156
|
+
var $bg = _ref3.$bg;
|
|
110
157
|
return $bg;
|
|
111
158
|
});
|
|
112
159
|
|
|
113
160
|
/** A small pill for link metadata (media kind, duration, …). */
|
|
114
161
|
var StyledChip = exports.StyledChip = _styledComponents.default.span.withConfig({
|
|
115
162
|
displayName: "shared__StyledChip",
|
|
116
|
-
componentId: "sc-1x5md9a-
|
|
163
|
+
componentId: "sc-1x5md9a-5"
|
|
117
164
|
})(["display:inline-flex;align-items:center;padding:2px 8px;border-radius:10px;background:var(--color-theme-300);color:var(--color-theme-800);font-size:11px;white-space:nowrap;"]);
|
|
118
165
|
|
|
119
166
|
/** A solid-colour cover fill (swatch value, generic link cover, image stand-in). */
|
|
120
167
|
var StyledColorCover = exports.StyledColorCover = _styledComponents.default.div.withConfig({
|
|
121
168
|
displayName: "shared__StyledColorCover",
|
|
122
|
-
componentId: "sc-1x5md9a-
|
|
123
|
-
})(["width:100%;height:100%;background:", ";"], function (
|
|
124
|
-
var $color =
|
|
169
|
+
componentId: "sc-1x5md9a-6"
|
|
170
|
+
})(["width:100%;height:100%;background:", ";"], function (_ref4) {
|
|
171
|
+
var $color = _ref4.$color;
|
|
125
172
|
return $color;
|
|
126
173
|
});
|
|
127
174
|
|
|
@@ -131,12 +178,12 @@ var StyledColorCover = exports.StyledColorCover = _styledComponents.default.div.
|
|
|
131
178
|
|
|
132
179
|
var StyledPlaceholder = _styledComponents.default.button.withConfig({
|
|
133
180
|
displayName: "shared__StyledPlaceholder",
|
|
134
|
-
componentId: "sc-1x5md9a-
|
|
135
|
-
})(["display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;width:100%;height:", "px;padding:0;border:0;background:transparent;color:var(--color-theme-600);text-align:center;cursor:pointer;", " > svg{width:40px;height:40px;color:var(--color-theme-500);}"], function (
|
|
136
|
-
var $height =
|
|
181
|
+
componentId: "sc-1x5md9a-7"
|
|
182
|
+
})(["display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;width:100%;height:", "px;padding:0;border:0;background:transparent;color:var(--color-theme-600);text-align:center;cursor:pointer;", " > svg{width:40px;height:40px;color:var(--color-theme-500);}"], function (_ref5) {
|
|
183
|
+
var $height = _ref5.$height;
|
|
137
184
|
return $height !== null && $height !== void 0 ? $height : 150;
|
|
138
|
-
}, function (
|
|
139
|
-
var $dashed =
|
|
185
|
+
}, function (_ref6) {
|
|
186
|
+
var $dashed = _ref6.$dashed;
|
|
140
187
|
return $dashed && (0, _styledComponents.css)(["margin:8px;width:calc(100% - 16px);border:1.5px dashed var(--color-theme-400);border-radius:6px;&:hover{border-color:var(--sc-selection-ring);color:var(--color-theme-700);}"]);
|
|
141
188
|
});
|
|
142
189
|
|
|
@@ -145,12 +192,12 @@ var StyledPlaceholder = _styledComponents.default.button.withConfig({
|
|
|
145
192
|
* sentence-case invitation (ActiveCollab voice). Interactive by design — the
|
|
146
193
|
* whole frame is a button — and distinct from the loading skeleton.
|
|
147
194
|
*/
|
|
148
|
-
var Placeholder = exports.Placeholder = function Placeholder(
|
|
149
|
-
var icon =
|
|
150
|
-
label =
|
|
151
|
-
height =
|
|
152
|
-
dashed =
|
|
153
|
-
rest = _objectWithoutProperties(
|
|
195
|
+
var Placeholder = exports.Placeholder = function Placeholder(_ref7) {
|
|
196
|
+
var icon = _ref7.icon,
|
|
197
|
+
label = _ref7.label,
|
|
198
|
+
height = _ref7.height,
|
|
199
|
+
dashed = _ref7.dashed,
|
|
200
|
+
rest = _objectWithoutProperties(_ref7, _excluded);
|
|
154
201
|
return /*#__PURE__*/_react.default.createElement(StyledPlaceholder, _extends({
|
|
155
202
|
type: "button",
|
|
156
203
|
$height: height,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","names":["_react","_interopRequireDefault","require","_styledComponents","_interopRequireWildcard","_Icons","_StackedCard","_Typography","_Typography2","_excluded","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","_t","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_objectWithoutProperties","_objectWithoutPropertiesLoose","getOwnPropertySymbols","length","indexOf","propertyIsEnumerable","_extends","assign","bind","arguments","apply","COVER_RATIO_HERO","exports","COVER_RATIO_IMAGE","COVER_RATIO_SWATCH","playControl","createElement","StackedCardPlayBadge","PlayIcon","coverManagement","_ref","undefined","_ref$removeLabel","removeLabel","onCollapse","onRemove","Fragment","StackedCardCoverButton","type","onClick","StackedCardCollapseGlyph","StackedCardRemoveCoverGlyph","StyledEntityDots","styled","button","withConfig","displayName","componentId","EntityDots","props","className","STACKED_CARD_CONTROL_CLASS","TreeDotsIcon","StyledClamp","Body2","StyledFavicon","span","_ref2","$bg","StyledChip","StyledColorCover","div","_ref3","$color","StyledPlaceholder","_ref4","$height","_ref5","$dashed","css","Placeholder","_ref6","icon","label","height","dashed","rest","Typography","as","variant","color"],"sources":["../../../../../src/presentation/stackedCard/content/shared.tsx"],"sourcesContent":["import React, { ReactElement, ReactNode } from \"react\";\n\nimport styled, { css } from \"styled-components\";\n\nimport { PlayIcon, TreeDotsIcon } from \"../../../components/Icons\";\nimport {\n STACKED_CARD_CONTROL_CLASS,\n StackedCardCollapseGlyph as CollapseGlyph,\n StackedCardCoverButton as CoverButton,\n StackedCardPlayBadge as PlayBadge,\n StackedCardRemoveCoverGlyph as RemoveCoverGlyph,\n} from \"../../../components/StackedCard\";\nimport { Body2 } from \"../../../components/Typography\";\nimport { Typography } from \"../../../components/Typography/Typography\";\n\n/**\n * Content-level chrome shared by the typed StackedCard components.\n *\n * These live OUTSIDE the shell on purpose. The shell is hollow; the \"…\" entity\n * menu, the cover-management controls, the clamp, the favicon, the chips and\n * the placeholder frame are content concerns, so they belong here where the\n * typed cards (TaskCard, LinkCard, …) compose them.\n *\n * The card itself — the shell, the Stack/StackRow/Cover primitives and the\n * cover chrome — is the shipped design-system component,\n * `components/StackedCard`. These stories import it under the concept\n * vocabulary (Cover, StackRow, …) so the spec prose and the code keep using\n * the same words.\n */\n\n/* ------------------------------------------------------------------ */\n/* Per-type cover ratios */\n/* ------------------------------------------------------------------ */\n\n/**\n * The design system ships one default cover ratio\n * (`STACKED_CARD_COVER_RATIO`). How tall a cover reads is a decision of the\n * content type, so the variants live here with the content: a link hero, a\n * full-bleed image, a colour swatch band.\n */\nexport const COVER_RATIO_HERO = \"320 / 190\";\nexport const COVER_RATIO_IMAGE = \"260 / 168\";\nexport const COVER_RATIO_SWATCH = \"260 / 104\";\n\n/* ------------------------------------------------------------------ */\n/* Cover chrome — media control + cover management */\n/* ------------------------------------------------------------------ */\n\n/** Centered media control (play), for a cover that wraps audio/video. */\nexport const playControl = (\n <PlayBadge>\n <PlayIcon />\n </PlayBadge>\n);\n\n/**\n * Top-right cover management. Acts on the COVER (collapse it, remove it) — not\n * on the entity. Callers wire the click handlers; the default is inert chrome\n * for the static demos.\n */\nexport const coverManagement = ({\n removeLabel = \"Remove cover\",\n onCollapse,\n onRemove,\n}: {\n removeLabel?: string;\n onCollapse?: () => void;\n onRemove?: () => void;\n} = {}): ReactElement => (\n <>\n <CoverButton type=\"button\" aria-label=\"Collapse cover\" onClick={onCollapse}>\n <CollapseGlyph />\n </CoverButton>\n <CoverButton type=\"button\" aria-label={removeLabel} onClick={onRemove}>\n <RemoveCoverGlyph />\n </CoverButton>\n </>\n);\n\n/* ------------------------------------------------------------------ */\n/* Entity \"…\" menu — acts on the ENTITY, lives in a content row */\n/* ------------------------------------------------------------------ */\n\nconst StyledEntityDots = styled.button`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n padding: 0;\n border: 0;\n border-radius: 6px;\n cursor: pointer;\n color: var(--color-theme-700);\n background: var(--color-theme-200);\n\n svg {\n width: 16px;\n height: 16px;\n display: block;\n }\n\n &:hover {\n background: var(--color-theme-300);\n }\n`;\n\nexport const EntityDots = (\n props: React.ButtonHTMLAttributes<HTMLButtonElement>\n): ReactElement => (\n <StyledEntityDots\n type=\"button\"\n aria-label=\"Options\"\n data-fixed\n className={STACKED_CARD_CONTROL_CLASS}\n {...props}\n >\n <TreeDotsIcon />\n </StyledEntityDots>\n);\n\n/* ------------------------------------------------------------------ */\n/* Text + inline bits */\n/* ------------------------------------------------------------------ */\n\n/** Two-line title clamp — the card's name row content. */\nexport const StyledClamp = styled(Body2)`\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n`;\n\n/** A favicon square — a solid data colour stands in for the real favicon. */\nexport const StyledFavicon = styled.span<{ $bg: string }>`\n display: inline-flex;\n width: 16px;\n height: 16px;\n border-radius: 4px;\n background: ${({ $bg }) => $bg};\n flex-shrink: 0;\n`;\n\n/** A small pill for link metadata (media kind, duration, …). */\nexport const StyledChip = styled.span`\n display: inline-flex;\n align-items: center;\n padding: 2px 8px;\n border-radius: 10px;\n background: var(--color-theme-300);\n color: var(--color-theme-800);\n font-size: 11px;\n white-space: nowrap;\n`;\n\n/** A solid-colour cover fill (swatch value, generic link cover, image stand-in). */\nexport const StyledColorCover = styled.div<{ $color: string }>`\n width: 100%;\n height: 100%;\n background: ${({ $color }) => $color};\n`;\n\n/* ------------------------------------------------------------------ */\n/* Placeholder frame — the interactive empty state, per type */\n/* ------------------------------------------------------------------ */\n\nconst StyledPlaceholder = styled.button<{\n $height?: number;\n $dashed?: boolean;\n}>`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 10px;\n width: 100%;\n height: ${({ $height }) => $height ?? 150}px;\n padding: 0;\n border: 0;\n background: transparent;\n color: var(--color-theme-600);\n text-align: center;\n cursor: pointer;\n\n ${({ $dashed }) =>\n $dashed &&\n css`\n margin: 8px;\n width: calc(100% - 16px);\n border: 1.5px dashed var(--color-theme-400);\n border-radius: 6px;\n\n &:hover {\n border-color: var(--sc-selection-ring);\n color: var(--color-theme-700);\n }\n `}\n\n > svg {\n width: 40px;\n height: 40px;\n color: var(--color-theme-500);\n }\n`;\n\n/**\n * The shared placeholder frame. Each type supplies its own icon and verb-first,\n * sentence-case invitation (ActiveCollab voice). Interactive by design — the\n * whole frame is a button — and distinct from the loading skeleton.\n */\nexport const Placeholder = ({\n icon,\n label,\n height,\n dashed,\n ...rest\n}: {\n icon: ReactNode;\n label: ReactNode;\n height?: number;\n dashed?: boolean;\n} & React.ButtonHTMLAttributes<HTMLButtonElement>): ReactElement => (\n <StyledPlaceholder type=\"button\" $height={height} $dashed={dashed} {...rest}>\n {icon}\n <Typography as=\"span\" variant=\"Body 2\" color=\"secondary\">\n {label}\n </Typography>\n </StyledPlaceholder>\n);\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"shared.js","names":["_react","_interopRequireDefault","require","_styledComponents","_interopRequireWildcard","_Icons","_StackedCard","_Typography","_Typography2","_excluded","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","_t","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_objectWithoutProperties","_objectWithoutPropertiesLoose","getOwnPropertySymbols","length","indexOf","propertyIsEnumerable","_extends","assign","bind","arguments","apply","CARD_FONT","exports","COVER_RATIO_HERO","COVER_RATIO_IMAGE","COVER_RATIO_SWATCH","playControl","createElement","StackedCardPlayBadge","PlayIcon","coverManagement","_ref","undefined","_ref$removeLabel","removeLabel","onCollapse","onRemove","Fragment","StackedCardCoverButton","type","onClick","StackedCardCollapseGlyph","StackedCardRemoveCoverGlyph","StyledEntityDots","styled","button","withConfig","displayName","componentId","EntityDots","props","className","STACKED_CARD_CONTROL_CLASS","TreeDotsIcon","StyledClamp","Body2","StyledTitleBlock","div","StyledProjectLine","Caption2","CardProjectLine","_ref2","children","color","StyledFavicon","span","_ref3","$bg","StyledChip","StyledColorCover","_ref4","$color","StyledPlaceholder","_ref5","$height","_ref6","$dashed","css","Placeholder","_ref7","icon","label","height","dashed","rest","Typography","as","variant"],"sources":["../../../../../src/presentation/stackedCard/content/shared.tsx"],"sourcesContent":["import React, { ReactElement, ReactNode } from \"react\";\n\nimport styled, { css } from \"styled-components\";\n\nimport { PlayIcon, TreeDotsIcon } from \"../../../components/Icons\";\nimport {\n STACKED_CARD_CONTROL_CLASS,\n StackedCardCollapseGlyph as CollapseGlyph,\n StackedCardCoverButton as CoverButton,\n StackedCardPlayBadge as PlayBadge,\n StackedCardRemoveCoverGlyph as RemoveCoverGlyph,\n} from \"../../../components/StackedCard\";\nimport { Body2, Caption2 } from \"../../../components/Typography\";\nimport { Typography } from \"../../../components/Typography/Typography\";\n\n/**\n * Content-level chrome shared by the typed StackedCard components.\n *\n * These live OUTSIDE the shell on purpose. The shell is hollow; the \"…\" entity\n * menu, the cover-management controls, the clamp, the favicon, the chips and\n * the placeholder frame are content concerns, so they belong here where the\n * typed cards (TaskCard, LinkCard, …) compose them.\n *\n * The card itself — the shell, the Stack/StackRow/Cover primitives and the\n * cover chrome — is the shipped design-system component,\n * `components/StackedCard`. These stories import it under the concept\n * vocabulary (Cover, StackRow, …) so the spec prose and the code keep using\n * the same words.\n */\n\n/* ------------------------------------------------------------------ */\n/* The font stack for raw text */\n/* ------------------------------------------------------------------ */\n\n/**\n * There is no global CSS reset in this Storybook, so a raw element (a `<span>`\n * holding a date, a `<button>` holding a word) falls back to the browser default\n * — a SERIF face at the UA's own size. Anything that is not a DS `Typography`\n * has to name the font itself. Use a DS Typography where one fits; use this\n * where the app itself sets the size in CSS (the column card's date row is a\n * plain `div` in `view.project_tasks_column_mode.less`, not a Typography).\n */\nexport const CARD_FONT = `-apple-system, BlinkMacSystemFont, \"Roboto\",\n \"Helvetica Neue\", Arial, sans-serif`;\n\n/* ------------------------------------------------------------------ */\n/* Per-type cover ratios */\n/* ------------------------------------------------------------------ */\n\n/**\n * The design system ships one default cover ratio\n * (`STACKED_CARD_COVER_RATIO`). How tall a cover reads is a decision of the\n * content type, so the variants live here with the content: a link hero, a\n * full-bleed image, a colour swatch band.\n */\nexport const COVER_RATIO_HERO = \"320 / 190\";\nexport const COVER_RATIO_IMAGE = \"260 / 168\";\nexport const COVER_RATIO_SWATCH = \"260 / 104\";\n\n/* ------------------------------------------------------------------ */\n/* Cover chrome — media control + cover management */\n/* ------------------------------------------------------------------ */\n\n/** Centered media control (play), for a cover that wraps audio/video. */\nexport const playControl = (\n <PlayBadge>\n <PlayIcon />\n </PlayBadge>\n);\n\n/**\n * Top-right cover management. Acts on the COVER (collapse it, remove it) — not\n * on the entity. Callers wire the click handlers; the default is inert chrome\n * for the static demos.\n */\nexport const coverManagement = ({\n removeLabel = \"Remove cover\",\n onCollapse,\n onRemove,\n}: {\n removeLabel?: string;\n onCollapse?: () => void;\n onRemove?: () => void;\n} = {}): ReactElement => (\n <>\n <CoverButton type=\"button\" aria-label=\"Collapse cover\" onClick={onCollapse}>\n <CollapseGlyph />\n </CoverButton>\n <CoverButton type=\"button\" aria-label={removeLabel} onClick={onRemove}>\n <RemoveCoverGlyph />\n </CoverButton>\n </>\n);\n\n/* ------------------------------------------------------------------ */\n/* Entity \"…\" menu — acts on the ENTITY, lives in a content row */\n/* ------------------------------------------------------------------ */\n\nconst StyledEntityDots = styled.button`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n padding: 0;\n border: 0;\n border-radius: 6px;\n cursor: pointer;\n color: var(--color-theme-700);\n background: var(--color-theme-200);\n\n svg {\n width: 16px;\n height: 16px;\n display: block;\n }\n\n &:hover {\n background: var(--color-theme-300);\n }\n`;\n\nexport const EntityDots = (\n props: React.ButtonHTMLAttributes<HTMLButtonElement>\n): ReactElement => (\n <StyledEntityDots\n type=\"button\"\n aria-label=\"Options\"\n data-fixed\n className={STACKED_CARD_CONTROL_CLASS}\n {...props}\n >\n <TreeDotsIcon />\n </StyledEntityDots>\n);\n\n/* ------------------------------------------------------------------ */\n/* Text + inline bits */\n/* ------------------------------------------------------------------ */\n\n/** Two-line title clamp — the card's name row content. */\nexport const StyledClamp = styled(Body2)`\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n`;\n\n/**\n * The title block — everything the title row stacks to the LEFT of the \"…\"\n * menu. A card that only has a title puts the clamp straight in the row; a card\n * that puts a line above or below it (the project a task belongs to, the client\n * a project is for) stacks them here so the row keeps its two-child shape:\n * text block, then the fixed-width menu.\n */\nexport const StyledTitleBlock = styled.div`\n display: flex;\n flex-direction: column;\n min-width: 0;\n`;\n\n/**\n * The project a card's entity lives in, above the title.\n *\n * On a canvas a task card has lost the column that used to say which project it\n * came from, so the card says it itself. One line, one treatment, shared by\n * every content type that can carry it (the whiteboard's own task face already\n * wrote it this way: `Caption 2` tertiary, tight above the title, ellipsis on\n * overflow — a project name is a reference, never a second title).\n */\nexport const StyledProjectLine = styled(Caption2)`\n display: block;\n margin-bottom: 2px;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n`;\n\nexport const CardProjectLine = ({\n children,\n}: {\n children: ReactNode;\n}): ReactElement => (\n <StyledProjectLine color=\"tertiary\" className=\"sc-project\">\n {children}\n </StyledProjectLine>\n);\n\n/** A favicon square — a solid data colour stands in for the real favicon. */\nexport const StyledFavicon = styled.span<{ $bg: string }>`\n display: inline-flex;\n width: 16px;\n height: 16px;\n border-radius: 4px;\n background: ${({ $bg }) => $bg};\n flex-shrink: 0;\n`;\n\n/** A small pill for link metadata (media kind, duration, …). */\nexport const StyledChip = styled.span`\n display: inline-flex;\n align-items: center;\n padding: 2px 8px;\n border-radius: 10px;\n background: var(--color-theme-300);\n color: var(--color-theme-800);\n font-size: 11px;\n white-space: nowrap;\n`;\n\n/** A solid-colour cover fill (swatch value, generic link cover, image stand-in). */\nexport const StyledColorCover = styled.div<{ $color: string }>`\n width: 100%;\n height: 100%;\n background: ${({ $color }) => $color};\n`;\n\n/* ------------------------------------------------------------------ */\n/* Placeholder frame — the interactive empty state, per type */\n/* ------------------------------------------------------------------ */\n\nconst StyledPlaceholder = styled.button<{\n $height?: number;\n $dashed?: boolean;\n}>`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 10px;\n width: 100%;\n height: ${({ $height }) => $height ?? 150}px;\n padding: 0;\n border: 0;\n background: transparent;\n color: var(--color-theme-600);\n text-align: center;\n cursor: pointer;\n\n ${({ $dashed }) =>\n $dashed &&\n css`\n margin: 8px;\n width: calc(100% - 16px);\n border: 1.5px dashed var(--color-theme-400);\n border-radius: 6px;\n\n &:hover {\n border-color: var(--sc-selection-ring);\n color: var(--color-theme-700);\n }\n `}\n\n > svg {\n width: 40px;\n height: 40px;\n color: var(--color-theme-500);\n }\n`;\n\n/**\n * The shared placeholder frame. Each type supplies its own icon and verb-first,\n * sentence-case invitation (ActiveCollab voice). Interactive by design — the\n * whole frame is a button — and distinct from the loading skeleton.\n */\nexport const Placeholder = ({\n icon,\n label,\n height,\n dashed,\n ...rest\n}: {\n icon: ReactNode;\n label: ReactNode;\n height?: number;\n dashed?: boolean;\n} & React.ButtonHTMLAttributes<HTMLButtonElement>): ReactElement => (\n <StyledPlaceholder type=\"button\" $height={height} $dashed={dashed} {...rest}>\n {icon}\n <Typography as=\"span\" variant=\"Body 2\" color=\"secondary\">\n {label}\n </Typography>\n </StyledPlaceholder>\n);\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.verticalDivider = exports.isShapeTool = exports.ToolSurface = exports.ToolButton = exports.TOOL_HINTS = exports.
|
|
6
|
+
exports.verticalDivider = exports.isShapeTool = exports.ToolSurface = exports.ToolButton = exports.TOOL_HINTS = exports.StyledToolPill = exports.StyledHint = exports.StyledBottomDock = exports.SHAPE_TOOLS = exports.SHAPE_DEFAULT_SIZES = exports.DEFAULT_SHAPE_TOOL = exports.DEFAULT_PROJECT_ELEMENT_TOOL = exports.CARD_PREVIEW_HEIGHT = exports.BottomDock = void 0;
|
|
7
7
|
var _react = _interopRequireWildcard(require("react"));
|
|
8
8
|
var _styledComponents = _interopRequireDefault(require("styled-components"));
|
|
9
9
|
var _IconButton = require("../../components/IconButton");
|
|
@@ -27,7 +27,7 @@ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
|
|
|
27
27
|
var ToolSurface = exports.ToolSurface = _styledComponents.default.div.withConfig({
|
|
28
28
|
displayName: "bottomDock__ToolSurface",
|
|
29
29
|
componentId: "sc-1xsxwg0-0"
|
|
30
|
-
})(["display:flex;align-items:center;gap:2px;padding:6px;border-radius:14px;background-color:var(--page-paper-main);box-shadow:0 6px 24px rgba(0,0,0,0.16);border:1px solid var(--border-primary);"]);
|
|
30
|
+
})(["display:flex;align-items:center;gap:2px;padding:6px;border-radius:14px;background-color:var(--page-paper-main);box-shadow:0 6px 24px rgba(0,0,0,0.16);border:1px solid var(--border-primary);svg > [stroke],svg > g [stroke]{stroke:currentColor;}"]);
|
|
31
31
|
|
|
32
32
|
/* vertical separator used inside the toolbars */
|
|
33
33
|
var verticalDivider = exports.verticalDivider = "\n .divider {\n width: 1px;\n height: 24px;\n background-color: var(--color-theme-400);\n margin: 0 6px;\n flex-shrink: 0;\n }\n";
|
|
@@ -36,9 +36,16 @@ var StyledBottomDock = exports.StyledBottomDock = _styledComponents.default.div.
|
|
|
36
36
|
componentId: "sc-1xsxwg0-1"
|
|
37
37
|
})(["position:absolute;left:50%;bottom:18px;transform:translateX(-50%);display:flex;flex-direction:column;align-items:center;gap:10px;max-width:calc(100% - 32px);"]);
|
|
38
38
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
39
|
+
/**
|
|
40
|
+
* The floating second toolbar row — a small pill above the dock that holds the
|
|
41
|
+
* members of one tool family (Circle / Rectangle / Triangle, or Task / Project).
|
|
42
|
+
*
|
|
43
|
+
* It is the same surface as the dock itself, so a family reads as an extension
|
|
44
|
+
* of the button that opened it rather than as a different kind of UI. Only one
|
|
45
|
+
* pill is ever up, because only one tool is ever armed.
|
|
46
|
+
*/
|
|
47
|
+
var StyledToolPill = exports.StyledToolPill = (0, _styledComponents.default)(ToolSurface).withConfig({
|
|
48
|
+
displayName: "bottomDock__StyledToolPill",
|
|
42
49
|
componentId: "sc-1xsxwg0-2"
|
|
43
50
|
})([""]);
|
|
44
51
|
|
|
@@ -55,19 +62,22 @@ var TOOL_HINTS = exports.TOOL_HINTS = {
|
|
|
55
62
|
roundedRectangle: "Click to drop a default rectangle, or draw one to size. Press R for a rectangle.",
|
|
56
63
|
triangle: "Click to drop a default triangle, or draw one to size. Press Y for a triangle.",
|
|
57
64
|
connector: "Drag from one element to another to connect them. Press C to connect.",
|
|
65
|
+
projectElements: "Put a task or a project on the board — pick which above, then draw its card.",
|
|
66
|
+
project: "Draw a box to place a project card, then pick the project it shows.",
|
|
67
|
+
task: "Draw a box to place a task card, then pick the task it shows.",
|
|
58
68
|
link: "Draw a box to place a link, or paste a URL anywhere. Press L for link.",
|
|
59
69
|
file: "Draw a box to place a file, or drop one on the board. Press F for file.",
|
|
60
70
|
sticky: "Click anywhere on the canvas to drop a sticky note. Press S for a sticky note.",
|
|
61
71
|
text: "Click anywhere on the canvas to start typing. Press T for text.",
|
|
62
72
|
draw: "Click and drag to draw freehand. Press D for the pen.",
|
|
63
|
-
shapes: "
|
|
73
|
+
shapes: "Pick a shape above, then draw it on the board. Press R for a rectangle."
|
|
64
74
|
};
|
|
65
75
|
|
|
66
76
|
/**
|
|
67
|
-
* The armed board tool. Link, File and the three shapes are
|
|
68
|
-
* turns the next canvas click into "drop the default-size
|
|
69
|
-
* drag into "draw one this big"; everything else stays a
|
|
70
|
-
* otherwise always in select mode.
|
|
77
|
+
* The armed board tool. Link, File, Project, Task and the three shapes are
|
|
78
|
+
* wired — arming one turns the next canvas click into "drop the default-size
|
|
79
|
+
* element here" and a drag into "draw one this big"; everything else stays a
|
|
80
|
+
* mock, so the board is otherwise always in select mode.
|
|
71
81
|
*/
|
|
72
82
|
|
|
73
83
|
var SHAPE_TOOLS = exports.SHAPE_TOOLS = ["circle", "roundedRectangle", "triangle"];
|
|
@@ -75,6 +85,19 @@ var isShapeTool = exports.isShapeTool = function isShapeTool(tool) {
|
|
|
75
85
|
return SHAPE_TOOLS.includes(tool);
|
|
76
86
|
};
|
|
77
87
|
|
|
88
|
+
/**
|
|
89
|
+
* What a dock button arms the instant its pill opens.
|
|
90
|
+
*
|
|
91
|
+
* Opening a family and choosing inside it are two separate decisions, and the
|
|
92
|
+
* second one has a right answer often enough that asking for it every time is
|
|
93
|
+
* just a toll: a shape is usually a rectangle, and the thing people put on a
|
|
94
|
+
* board is usually a task. So the pill opens with that member already armed and
|
|
95
|
+
* the gesture can start immediately — picking another member is a correction,
|
|
96
|
+
* not a required step.
|
|
97
|
+
*/
|
|
98
|
+
var DEFAULT_SHAPE_TOOL = exports.DEFAULT_SHAPE_TOOL = "roundedRectangle";
|
|
99
|
+
var DEFAULT_PROJECT_ELEMENT_TOOL = exports.DEFAULT_PROJECT_ELEMENT_TOOL = "task";
|
|
100
|
+
|
|
78
101
|
/* What a plain click drops — mirrors DEFAULT_SHAPE_SIZES in
|
|
79
102
|
new-activecollab-front, and is exactly what the hover preview promises. */
|
|
80
103
|
var SHAPE_DEFAULT_SIZES = exports.SHAPE_DEFAULT_SIZES = {
|
|
@@ -115,7 +138,10 @@ var ToolButton = exports.ToolButton = function ToolButton(_ref) {
|
|
|
115
138
|
onMouseLeave: onMouseLeave
|
|
116
139
|
}, children));
|
|
117
140
|
};
|
|
118
|
-
/* Bottom-centre tool dock
|
|
141
|
+
/* Bottom-centre tool dock: the family pill (when one is open), the main
|
|
142
|
+
toolbar, and the shared hint line. The dock is anchored by its BOTTOM edge,
|
|
143
|
+
so a pill appearing or disappearing grows the stack upwards and never moves
|
|
144
|
+
the toolbar itself. */
|
|
119
145
|
var BottomDock = exports.BottomDock = function BottomDock(_ref2) {
|
|
120
146
|
var activeTool = _ref2.activeTool,
|
|
121
147
|
onToolChange = _ref2.onToolChange;
|
|
@@ -138,43 +164,80 @@ var BottomDock = exports.BottomDock = function BottomDock(_ref2) {
|
|
|
138
164
|
gesture happens on the canvas, so that is exactly when the instruction is
|
|
139
165
|
needed. */
|
|
140
166
|
var hint = hoverHint !== null && hoverHint !== void 0 ? hoverHint : activeTool === "select" ? null : TOOL_HINTS[activeTool];
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
167
|
+
|
|
168
|
+
/* Which pill is up. Both are DERIVED from the armed tool rather than kept as
|
|
169
|
+
their own open/closed state: opening a pill always arms one of its members,
|
|
170
|
+
so "a member of this family is armed" and "this pill is showing" are the
|
|
171
|
+
same fact. Deriving it is what makes every way of leaving the family close
|
|
172
|
+
the pill for free — another dock tool, Esc on the canvas, or the gesture
|
|
173
|
+
finishing and disarming the tool. Two states could disagree; one cannot. */
|
|
174
|
+
var shapesOpen = isShapeTool(activeTool);
|
|
175
|
+
var projectElementsOpen = activeTool === "task" || activeTool === "project";
|
|
176
|
+
return /*#__PURE__*/_react.default.createElement(StyledBottomDock, null, shapesOpen ? /*#__PURE__*/_react.default.createElement(StyledToolPill, null, /*#__PURE__*/_react.default.createElement(ToolButton, _extends({
|
|
177
|
+
tip: "Circle",
|
|
145
178
|
active: activeTool === "circle",
|
|
146
179
|
onClick: function onClick() {
|
|
147
|
-
return onToolChange(
|
|
180
|
+
return onToolChange("circle");
|
|
148
181
|
}
|
|
149
|
-
}, hoverProps("circle")), /*#__PURE__*/_react.default.createElement(_Icons.CircleIcon, null))
|
|
150
|
-
|
|
151
|
-
}, /*#__PURE__*/_react.default.createElement(_IconButton.IconButton, _extends({
|
|
152
|
-
variant: "text gray",
|
|
182
|
+
}, hoverProps("circle")), /*#__PURE__*/_react.default.createElement(_Icons.CircleIcon, null)), /*#__PURE__*/_react.default.createElement(ToolButton, _extends({
|
|
183
|
+
tip: "Rectangle",
|
|
153
184
|
active: activeTool === "roundedRectangle",
|
|
154
185
|
onClick: function onClick() {
|
|
155
|
-
return onToolChange(
|
|
186
|
+
return onToolChange("roundedRectangle");
|
|
156
187
|
}
|
|
157
|
-
}, hoverProps("roundedRectangle")), /*#__PURE__*/_react.default.createElement(_Icons.RoundedRectangleIcon, null))
|
|
158
|
-
|
|
159
|
-
}, /*#__PURE__*/_react.default.createElement(_IconButton.IconButton, _extends({
|
|
160
|
-
variant: "text gray",
|
|
188
|
+
}, hoverProps("roundedRectangle")), /*#__PURE__*/_react.default.createElement(_Icons.RoundedRectangleIcon, null)), /*#__PURE__*/_react.default.createElement(ToolButton, _extends({
|
|
189
|
+
tip: "Triangle",
|
|
161
190
|
active: activeTool === "triangle",
|
|
162
191
|
onClick: function onClick() {
|
|
163
|
-
return onToolChange(
|
|
192
|
+
return onToolChange("triangle");
|
|
164
193
|
}
|
|
165
|
-
}, hoverProps("triangle")), /*#__PURE__*/_react.default.createElement(_Icons.TriangleIcon, null)))
|
|
194
|
+
}, hoverProps("triangle")), /*#__PURE__*/_react.default.createElement(_Icons.TriangleIcon, null))) : null, projectElementsOpen ? /*#__PURE__*/_react.default.createElement(StyledToolPill, null, /*#__PURE__*/_react.default.createElement(ToolButton, _extends({
|
|
195
|
+
tip: "Task",
|
|
196
|
+
active: activeTool === "task",
|
|
197
|
+
onClick: function onClick() {
|
|
198
|
+
return onToolChange("task");
|
|
199
|
+
}
|
|
200
|
+
}, hoverProps("task")), /*#__PURE__*/_react.default.createElement(_Icons.TaskIcon, null)), /*#__PURE__*/_react.default.createElement(ToolButton, _extends({
|
|
201
|
+
tip: "Project",
|
|
202
|
+
active: activeTool === "project",
|
|
203
|
+
onClick: function onClick() {
|
|
204
|
+
return onToolChange("project");
|
|
205
|
+
}
|
|
206
|
+
}, hoverProps("project")), /*#__PURE__*/_react.default.createElement(_Icons.ProjectIcon, null))) : null, /*#__PURE__*/_react.default.createElement(ToolSurface, null, /*#__PURE__*/_react.default.createElement(_Tooltip.Tooltip, {
|
|
166
207
|
title: "Sticky Note"
|
|
167
208
|
}, /*#__PURE__*/_react.default.createElement(_IconButton.IconButton, _extends({
|
|
168
|
-
variant: "text gray"
|
|
209
|
+
variant: "text gray",
|
|
210
|
+
onClick: function onClick() {
|
|
211
|
+
return onToolChange("select");
|
|
212
|
+
}
|
|
169
213
|
}, hoverProps("sticky")), /*#__PURE__*/_react.default.createElement(_Icons.NoteIcon, null))), /*#__PURE__*/_react.default.createElement(ToolButton, _extends({
|
|
170
|
-
tip: "Text"
|
|
214
|
+
tip: "Text",
|
|
215
|
+
onClick: function onClick() {
|
|
216
|
+
return onToolChange("select");
|
|
217
|
+
}
|
|
171
218
|
}, hoverProps("text")), /*#__PURE__*/_react.default.createElement(_Icons.TextIcon, null)), /*#__PURE__*/_react.default.createElement(ToolButton, _extends({
|
|
172
|
-
tip: "Draw"
|
|
219
|
+
tip: "Draw",
|
|
220
|
+
onClick: function onClick() {
|
|
221
|
+
return onToolChange("select");
|
|
222
|
+
}
|
|
173
223
|
}, hoverProps("draw")), /*#__PURE__*/_react.default.createElement(_Icons.DrawIcon, null)), /*#__PURE__*/_react.default.createElement(ToolButton, _extends({
|
|
174
|
-
tip: "Shape"
|
|
224
|
+
tip: "Shape",
|
|
225
|
+
active: shapesOpen,
|
|
226
|
+
onClick: function onClick() {
|
|
227
|
+
return onToolChange(shapesOpen ? "select" : DEFAULT_SHAPE_TOOL);
|
|
228
|
+
}
|
|
175
229
|
}, hoverProps("shapes")), /*#__PURE__*/_react.default.createElement(_Icons.ShapesIcon, null)), /*#__PURE__*/_react.default.createElement(ToolButton, _extends({
|
|
176
|
-
tip: "Connect"
|
|
230
|
+
tip: "Connect",
|
|
231
|
+
onClick: function onClick() {
|
|
232
|
+
return onToolChange("select");
|
|
233
|
+
}
|
|
177
234
|
}, hoverProps("connector")), /*#__PURE__*/_react.default.createElement(_Icons.ConnectionIcon, null)), /*#__PURE__*/_react.default.createElement(ToolButton, _extends({
|
|
235
|
+
tip: "Project Elements",
|
|
236
|
+
active: projectElementsOpen,
|
|
237
|
+
onClick: function onClick() {
|
|
238
|
+
return onToolChange(projectElementsOpen ? "select" : DEFAULT_PROJECT_ELEMENT_TOOL);
|
|
239
|
+
}
|
|
240
|
+
}, hoverProps("projectElements")), /*#__PURE__*/_react.default.createElement(_Icons.ProjectStarIcon, null)), /*#__PURE__*/_react.default.createElement(ToolButton, _extends({
|
|
178
241
|
tip: "Link",
|
|
179
242
|
active: activeTool === "link",
|
|
180
243
|
onClick: function onClick() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bottomDock.js","names":["_react","_interopRequireWildcard","require","_styledComponents","_interopRequireDefault","_IconButton","_Icons","_Tooltip","_Typography","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","_t","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_extends","assign","bind","arguments","length","apply","_slicedToArray","_arrayWithHoles","_iterableToArrayLimit","_unsupportedIterableToArray","_nonIterableRest","TypeError","a","_arrayLikeToArray","toString","slice","constructor","name","Array","from","test","l","Symbol","iterator","u","next","done","push","value","return","isArray","ToolSurface","exports","styled","div","withConfig","displayName","componentId","verticalDivider","StyledBottomDock","StyledShapePicker","StyledHint","Caption1","TOOL_HINTS","circle","roundedRectangle","triangle","connector","link","file","sticky","text","draw","shapes","SHAPE_TOOLS","isShapeTool","tool","includes","SHAPE_DEFAULT_SIZES","width","height","CARD_PREVIEW_HEIGHT","ToolButton","_ref","tip","active","children","onClick","onMouseEnter","onMouseLeave","createElement","Tooltip","title","IconButton","variant","BottomDock","_ref2","activeTool","onToolChange","_useState","useState","_useState2","hoverHint","setHoverHint","hoverProps","hint","CircleIcon","RoundedRectangleIcon","TriangleIcon","NoteIcon","TextIcon","DrawIcon","ShapesIcon","ConnectionIcon","InsertLinkIcon","AttachmentIcon","color","className","undefined"],"sources":["../../../../src/presentation/whiteboard/bottomDock.tsx"],"sourcesContent":["import React, { ReactElement, ReactNode, useState } from \"react\";\n\nimport styled from \"styled-components\";\n\nimport { IconButton } from \"../../components/IconButton\";\nimport {\n AttachmentIcon,\n CircleIcon,\n ConnectionIcon,\n DrawIcon,\n InsertLinkIcon,\n RoundedRectangleIcon,\n ShapesIcon,\n NoteIcon,\n TextIcon,\n TriangleIcon,\n} from \"../../components/Icons\";\nimport { Tooltip } from \"../../components/Tooltip\";\nimport { Caption1 } from \"../../components/Typography\";\n\n/* ------------------------------------------------------------------ */\n/* Floating toolbar surfaces */\n/* ------------------------------------------------------------------ */\n\n/* A floating, rounded toolbar surface (paper + shadow). */\nexport const ToolSurface = styled.div`\n display: flex;\n align-items: center;\n gap: 2px;\n padding: 6px;\n border-radius: 14px;\n background-color: var(--page-paper-main);\n box-shadow: 0 6px 24px rgba(0, 0, 0, 0.16);\n border: 1px solid var(--border-primary);\n`;\n\n/* vertical separator used inside the toolbars */\nexport const verticalDivider = `\n .divider {\n width: 1px;\n height: 24px;\n background-color: var(--color-theme-400);\n margin: 0 6px;\n flex-shrink: 0;\n }\n`;\n\nexport const StyledBottomDock = styled.div`\n position: absolute;\n left: 50%;\n bottom: 18px;\n transform: translateX(-50%);\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 10px;\n max-width: calc(100% - 32px);\n`;\n\n/* shape sub-toolbar: Circle / Rectangle / Triangle */\nexport const StyledShapePicker = styled(ToolSurface)``;\n\n/* Reserve two Caption1 lines (2 × 16px) so showing/hiding the hint never\n shifts the dock; visibility keeps the reserved space when hidden. */\nexport const StyledHint = styled(Caption1)`\n text-align: center;\n padding: 0 16px;\n min-height: 32px;\n\n &.hint-hidden {\n visibility: hidden;\n }\n`;\n\n/* Per-tool hint shown under the dock only while that tool is hovered. */\nexport const TOOL_HINTS = {\n circle:\n \"Click to drop a default circle, or draw one to size. Press O for a circle.\",\n roundedRectangle:\n \"Click to drop a default rectangle, or draw one to size. Press R for a rectangle.\",\n triangle:\n \"Click to drop a default triangle, or draw one to size. Press Y for a triangle.\",\n connector:\n \"Drag from one element to another to connect them. Press C to connect.\",\n link: \"Draw a box to place a link, or paste a URL anywhere. Press L for link.\",\n file: \"Draw a box to place a file, or drop one on the board. Press F for file.\",\n sticky:\n \"Click anywhere on the canvas to drop a sticky note. Press S for a sticky note.\",\n text: \"Click anywhere on the canvas to start typing. Press T for text.\",\n draw: \"Click and drag to draw freehand. Press D for the pen.\",\n shapes:\n \"Start drawing the shape on canvas to see the result. Press R to draw a rectangle.\",\n} as const;\n\nexport type ToolHintKey = keyof typeof TOOL_HINTS;\n\nexport type ShapeTool = \"circle\" | \"roundedRectangle\" | \"triangle\";\n\n/**\n * The armed board tool. Link, File and the three shapes are wired — arming one\n * turns the next canvas click into \"drop the default-size element here\" and a\n * drag into \"draw one this big\"; everything else stays a mock, so the board is\n * otherwise always in select mode.\n */\nexport type BoardTool = \"select\" | \"link\" | \"file\" | ShapeTool;\n\nexport const SHAPE_TOOLS: readonly ShapeTool[] = [\n \"circle\",\n \"roundedRectangle\",\n \"triangle\",\n];\n\nexport const isShapeTool = (tool: BoardTool): tool is ShapeTool =>\n (SHAPE_TOOLS as readonly string[]).includes(tool);\n\n/* What a plain click drops — mirrors DEFAULT_SHAPE_SIZES in\n new-activecollab-front, and is exactly what the hover preview promises. */\nexport const SHAPE_DEFAULT_SIZES: Record<\n ShapeTool,\n { width: number; height: number }\n> = {\n roundedRectangle: { width: 100, height: 60 },\n circle: { width: 80, height: 80 },\n triangle: { width: 80, height: 80 },\n};\n\n/* Cards are auto-height, so their hover preview uses the app's nominal wire\n height (DEFAULT_LINK_CARD_SIZE / DEFAULT_FILE_CARD_SIZE). */\nexport const CARD_PREVIEW_HEIGHT = 240;\n\n/** The kinds of card the draw gesture can place. */\nexport type DrawableTool = Exclude<BoardTool, \"select\">;\n\nexport interface ToolButtonProps {\n tip: string;\n active?: boolean;\n children: ReactNode;\n onClick?: () => void;\n onMouseEnter?: () => void;\n onMouseLeave?: () => void;\n}\n\nexport const ToolButton = ({\n tip,\n active,\n children,\n onClick,\n onMouseEnter,\n onMouseLeave,\n}: ToolButtonProps): ReactElement => (\n <Tooltip title={tip}>\n <IconButton\n variant=\"text gray\"\n active={active}\n onClick={onClick}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n >\n {children}\n </IconButton>\n </Tooltip>\n);\n\nexport interface BottomDockProps {\n activeTool: BoardTool;\n onToolChange: (tool: BoardTool) => void;\n}\n\n/* Bottom-centre tool dock (shape picker + main toolbar + hint). */\nexport const BottomDock = ({\n activeTool,\n onToolChange,\n}: BottomDockProps): ReactElement => {\n const [hoverHint, setHoverHint] = useState<string | null>(null);\n\n const hoverProps = (tool: ToolHintKey): Record<string, () => void> => ({\n onMouseEnter: () => setHoverHint(TOOL_HINTS[tool]),\n onMouseLeave: () => setHoverHint(null),\n });\n\n /* An armed tool keeps its hint up after the pointer leaves the dock — the\n gesture happens on the canvas, so that is exactly when the instruction is\n needed. */\n const hint =\n hoverHint ?? (activeTool === \"select\" ? null : TOOL_HINTS[activeTool]);\n\n return (\n <StyledBottomDock>\n <StyledShapePicker>\n <Tooltip title=\"Circle\">\n <IconButton\n variant=\"text gray\"\n active={activeTool === \"circle\"}\n onClick={() =>\n onToolChange(activeTool === \"circle\" ? \"select\" : \"circle\")\n }\n {...hoverProps(\"circle\")}\n >\n <CircleIcon />\n </IconButton>\n </Tooltip>\n <Tooltip title=\"Rectangle\">\n <IconButton\n variant=\"text gray\"\n active={activeTool === \"roundedRectangle\"}\n onClick={() =>\n onToolChange(\n activeTool === \"roundedRectangle\"\n ? \"select\"\n : \"roundedRectangle\"\n )\n }\n {...hoverProps(\"roundedRectangle\")}\n >\n <RoundedRectangleIcon />\n </IconButton>\n </Tooltip>\n <Tooltip title=\"Triangle\">\n <IconButton\n variant=\"text gray\"\n active={activeTool === \"triangle\"}\n onClick={() =>\n onToolChange(activeTool === \"triangle\" ? \"select\" : \"triangle\")\n }\n {...hoverProps(\"triangle\")}\n >\n <TriangleIcon />\n </IconButton>\n </Tooltip>\n </StyledShapePicker>\n\n <ToolSurface>\n <Tooltip title=\"Sticky Note\">\n <IconButton variant=\"text gray\" {...hoverProps(\"sticky\")}>\n <NoteIcon />\n </IconButton>\n </Tooltip>\n <ToolButton tip=\"Text\" {...hoverProps(\"text\")}>\n <TextIcon />\n </ToolButton>\n <ToolButton tip=\"Draw\" {...hoverProps(\"draw\")}>\n <DrawIcon />\n </ToolButton>\n <ToolButton tip=\"Shape\" {...hoverProps(\"shapes\")}>\n <ShapesIcon />\n </ToolButton>\n <ToolButton tip=\"Connect\" {...hoverProps(\"connector\")}>\n <ConnectionIcon />\n </ToolButton>\n <ToolButton\n tip=\"Link\"\n active={activeTool === \"link\"}\n onClick={() =>\n onToolChange(activeTool === \"link\" ? \"select\" : \"link\")\n }\n {...hoverProps(\"link\")}\n >\n <InsertLinkIcon />\n </ToolButton>\n <ToolButton\n tip=\"File\"\n active={activeTool === \"file\"}\n onClick={() =>\n onToolChange(activeTool === \"file\" ? \"select\" : \"file\")\n }\n {...hoverProps(\"file\")}\n >\n <AttachmentIcon />\n </ToolButton>\n </ToolSurface>\n\n <StyledHint color=\"tertiary\" className={hint ? undefined : \"hint-hidden\"}>\n {hint ?? \" \"}\n </StyledHint>\n </StyledBottomDock>\n );\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"bottomDock.js","names":["_react","_interopRequireWildcard","require","_styledComponents","_interopRequireDefault","_IconButton","_Icons","_Tooltip","_Typography","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","_t","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_extends","assign","bind","arguments","length","apply","_slicedToArray","_arrayWithHoles","_iterableToArrayLimit","_unsupportedIterableToArray","_nonIterableRest","TypeError","a","_arrayLikeToArray","toString","slice","constructor","name","Array","from","test","l","Symbol","iterator","u","next","done","push","value","return","isArray","ToolSurface","exports","styled","div","withConfig","displayName","componentId","verticalDivider","StyledBottomDock","StyledToolPill","StyledHint","Caption1","TOOL_HINTS","circle","roundedRectangle","triangle","connector","projectElements","project","task","link","file","sticky","text","draw","shapes","SHAPE_TOOLS","isShapeTool","tool","includes","DEFAULT_SHAPE_TOOL","DEFAULT_PROJECT_ELEMENT_TOOL","SHAPE_DEFAULT_SIZES","width","height","CARD_PREVIEW_HEIGHT","ToolButton","_ref","tip","active","children","onClick","onMouseEnter","onMouseLeave","createElement","Tooltip","title","IconButton","variant","BottomDock","_ref2","activeTool","onToolChange","_useState","useState","_useState2","hoverHint","setHoverHint","hoverProps","hint","shapesOpen","projectElementsOpen","CircleIcon","RoundedRectangleIcon","TriangleIcon","TaskIcon","ProjectIcon","NoteIcon","TextIcon","DrawIcon","ShapesIcon","ConnectionIcon","ProjectStarIcon","InsertLinkIcon","AttachmentIcon","color","className","undefined"],"sources":["../../../../src/presentation/whiteboard/bottomDock.tsx"],"sourcesContent":["import React, { ReactElement, ReactNode, useState } from \"react\";\n\nimport styled from \"styled-components\";\n\nimport { IconButton } from \"../../components/IconButton\";\nimport {\n AttachmentIcon,\n CircleIcon,\n ConnectionIcon,\n DrawIcon,\n InsertLinkIcon,\n ProjectIcon,\n ProjectStarIcon,\n RoundedRectangleIcon,\n ShapesIcon,\n NoteIcon,\n TaskIcon,\n TextIcon,\n TriangleIcon,\n} from \"../../components/Icons\";\nimport { Tooltip } from \"../../components/Tooltip\";\nimport { Caption1 } from \"../../components/Typography\";\n\n/* ------------------------------------------------------------------ */\n/* Floating toolbar surfaces */\n/* ------------------------------------------------------------------ */\n\n/* A floating, rounded toolbar surface (paper + shadow). */\nexport const ToolSurface = styled.div`\n display: flex;\n align-items: center;\n gap: 2px;\n padding: 6px;\n border-radius: 14px;\n background-color: var(--page-paper-main);\n box-shadow: 0 6px 24px rgba(0, 0, 0, 0.16);\n border: 1px solid var(--border-primary);\n\n /* A DS button colours its icon by declaring svg { fill: currentColor }, so\n every FILLED glyph follows the button's active and hover states for free.\n Three glyphs here are not filled: RoundedRectangleIcon and TriangleIcon are\n outlines with a stroke of var(--color-theme-600) baked into the path, and\n ProjectIcon draws its ruler as a stroked rect. Nothing about the button\n could ever reach them — an armed rectangle stayed exactly as grey as an\n unarmed one. This extends the same currentColor contract to a declared\n stroke.\n\n Scoped to direct children and to shapes inside a <g>, NOT to every\n descendant: ProjectIcon cuts its ruler with a <mask> whose <line> is\n stroked BLACK on purpose. In a mask only luminance matters, so recolouring\n that line would turn a clean diagonal cut into a half-transparent smear. */\n svg > [stroke],\n svg > g [stroke] {\n stroke: currentColor;\n }\n`;\n\n/* vertical separator used inside the toolbars */\nexport const verticalDivider = `\n .divider {\n width: 1px;\n height: 24px;\n background-color: var(--color-theme-400);\n margin: 0 6px;\n flex-shrink: 0;\n }\n`;\n\nexport const StyledBottomDock = styled.div`\n position: absolute;\n left: 50%;\n bottom: 18px;\n transform: translateX(-50%);\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 10px;\n max-width: calc(100% - 32px);\n`;\n\n/**\n * The floating second toolbar row — a small pill above the dock that holds the\n * members of one tool family (Circle / Rectangle / Triangle, or Task / Project).\n *\n * It is the same surface as the dock itself, so a family reads as an extension\n * of the button that opened it rather than as a different kind of UI. Only one\n * pill is ever up, because only one tool is ever armed.\n */\nexport const StyledToolPill = styled(ToolSurface)``;\n\n/* Reserve two Caption1 lines (2 × 16px) so showing/hiding the hint never\n shifts the dock; visibility keeps the reserved space when hidden. */\nexport const StyledHint = styled(Caption1)`\n text-align: center;\n padding: 0 16px;\n min-height: 32px;\n\n &.hint-hidden {\n visibility: hidden;\n }\n`;\n\n/* Per-tool hint shown under the dock only while that tool is hovered. */\nexport const TOOL_HINTS = {\n circle:\n \"Click to drop a default circle, or draw one to size. Press O for a circle.\",\n roundedRectangle:\n \"Click to drop a default rectangle, or draw one to size. Press R for a rectangle.\",\n triangle:\n \"Click to drop a default triangle, or draw one to size. Press Y for a triangle.\",\n connector:\n \"Drag from one element to another to connect them. Press C to connect.\",\n projectElements:\n \"Put a task or a project on the board — pick which above, then draw its card.\",\n project:\n \"Draw a box to place a project card, then pick the project it shows.\",\n task: \"Draw a box to place a task card, then pick the task it shows.\",\n link: \"Draw a box to place a link, or paste a URL anywhere. Press L for link.\",\n file: \"Draw a box to place a file, or drop one on the board. Press F for file.\",\n sticky:\n \"Click anywhere on the canvas to drop a sticky note. Press S for a sticky note.\",\n text: \"Click anywhere on the canvas to start typing. Press T for text.\",\n draw: \"Click and drag to draw freehand. Press D for the pen.\",\n shapes:\n \"Pick a shape above, then draw it on the board. Press R for a rectangle.\",\n} as const;\n\nexport type ToolHintKey = keyof typeof TOOL_HINTS;\n\nexport type ShapeTool = \"circle\" | \"roundedRectangle\" | \"triangle\";\n\n/**\n * The armed board tool. Link, File, Project, Task and the three shapes are\n * wired — arming one turns the next canvas click into \"drop the default-size\n * element here\" and a drag into \"draw one this big\"; everything else stays a\n * mock, so the board is otherwise always in select mode.\n */\nexport type BoardTool =\n | \"select\"\n | \"link\"\n | \"file\"\n | \"project\"\n | \"task\"\n | ShapeTool;\n\nexport const SHAPE_TOOLS: readonly ShapeTool[] = [\n \"circle\",\n \"roundedRectangle\",\n \"triangle\",\n];\n\nexport const isShapeTool = (tool: BoardTool): tool is ShapeTool =>\n (SHAPE_TOOLS as readonly string[]).includes(tool);\n\n/**\n * What a dock button arms the instant its pill opens.\n *\n * Opening a family and choosing inside it are two separate decisions, and the\n * second one has a right answer often enough that asking for it every time is\n * just a toll: a shape is usually a rectangle, and the thing people put on a\n * board is usually a task. So the pill opens with that member already armed and\n * the gesture can start immediately — picking another member is a correction,\n * not a required step.\n */\nexport const DEFAULT_SHAPE_TOOL: ShapeTool = \"roundedRectangle\";\nexport const DEFAULT_PROJECT_ELEMENT_TOOL: BoardTool = \"task\";\n\n/* What a plain click drops — mirrors DEFAULT_SHAPE_SIZES in\n new-activecollab-front, and is exactly what the hover preview promises. */\nexport const SHAPE_DEFAULT_SIZES: Record<\n ShapeTool,\n { width: number; height: number }\n> = {\n roundedRectangle: { width: 100, height: 60 },\n circle: { width: 80, height: 80 },\n triangle: { width: 80, height: 80 },\n};\n\n/* Cards are auto-height, so their hover preview uses the app's nominal wire\n height (DEFAULT_LINK_CARD_SIZE / DEFAULT_FILE_CARD_SIZE). */\nexport const CARD_PREVIEW_HEIGHT = 240;\n\n/** The kinds of card the draw gesture can place. */\nexport type DrawableTool = Exclude<BoardTool, \"select\">;\n\nexport interface ToolButtonProps {\n tip: string;\n active?: boolean;\n children: ReactNode;\n onClick?: () => void;\n onMouseEnter?: () => void;\n onMouseLeave?: () => void;\n}\n\nexport const ToolButton = ({\n tip,\n active,\n children,\n onClick,\n onMouseEnter,\n onMouseLeave,\n}: ToolButtonProps): ReactElement => (\n <Tooltip title={tip}>\n <IconButton\n variant=\"text gray\"\n active={active}\n onClick={onClick}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n >\n {children}\n </IconButton>\n </Tooltip>\n);\n\nexport interface BottomDockProps {\n activeTool: BoardTool;\n onToolChange: (tool: BoardTool) => void;\n}\n\n/* Bottom-centre tool dock: the family pill (when one is open), the main\n toolbar, and the shared hint line. The dock is anchored by its BOTTOM edge,\n so a pill appearing or disappearing grows the stack upwards and never moves\n the toolbar itself. */\nexport const BottomDock = ({\n activeTool,\n onToolChange,\n}: BottomDockProps): ReactElement => {\n const [hoverHint, setHoverHint] = useState<string | null>(null);\n\n const hoverProps = (tool: ToolHintKey): Record<string, () => void> => ({\n onMouseEnter: () => setHoverHint(TOOL_HINTS[tool]),\n onMouseLeave: () => setHoverHint(null),\n });\n\n /* An armed tool keeps its hint up after the pointer leaves the dock — the\n gesture happens on the canvas, so that is exactly when the instruction is\n needed. */\n const hint =\n hoverHint ?? (activeTool === \"select\" ? null : TOOL_HINTS[activeTool]);\n\n /* Which pill is up. Both are DERIVED from the armed tool rather than kept as\n their own open/closed state: opening a pill always arms one of its members,\n so \"a member of this family is armed\" and \"this pill is showing\" are the\n same fact. Deriving it is what makes every way of leaving the family close\n the pill for free — another dock tool, Esc on the canvas, or the gesture\n finishing and disarming the tool. Two states could disagree; one cannot. */\n const shapesOpen = isShapeTool(activeTool);\n const projectElementsOpen = activeTool === \"task\" || activeTool === \"project\";\n\n return (\n <StyledBottomDock>\n {/* Shapes pill — hidden until the Shape dock button opens it. Inside a\n pill a click is a plain choice, never a toggle off: the dock button is\n what closes the family, so clicking the armed shape again must not\n make the row that is being used disappear. */}\n {shapesOpen ? (\n <StyledToolPill>\n <ToolButton\n tip=\"Circle\"\n active={activeTool === \"circle\"}\n onClick={() => onToolChange(\"circle\")}\n {...hoverProps(\"circle\")}\n >\n <CircleIcon />\n </ToolButton>\n <ToolButton\n tip=\"Rectangle\"\n active={activeTool === \"roundedRectangle\"}\n onClick={() => onToolChange(\"roundedRectangle\")}\n {...hoverProps(\"roundedRectangle\")}\n >\n <RoundedRectangleIcon />\n </ToolButton>\n <ToolButton\n tip=\"Triangle\"\n active={activeTool === \"triangle\"}\n onClick={() => onToolChange(\"triangle\")}\n {...hoverProps(\"triangle\")}\n >\n <TriangleIcon />\n </ToolButton>\n </StyledToolPill>\n ) : null}\n\n {/* Project Elements pill — the same surface, the same button size and\n spacing, in the same slot above the dock. Task comes first because it\n is what the button arms by default. */}\n {projectElementsOpen ? (\n <StyledToolPill>\n <ToolButton\n tip=\"Task\"\n active={activeTool === \"task\"}\n onClick={() => onToolChange(\"task\")}\n {...hoverProps(\"task\")}\n >\n <TaskIcon />\n </ToolButton>\n <ToolButton\n tip=\"Project\"\n active={activeTool === \"project\"}\n onClick={() => onToolChange(\"project\")}\n {...hoverProps(\"project\")}\n >\n <ProjectIcon />\n </ToolButton>\n </StyledToolPill>\n ) : null}\n\n <ToolSurface>\n {/* The tools that are still mocks arm nothing — but they do DISARM, so\n reaching for one closes whatever pill is up and ends the gesture the\n board was waiting for. A dead button that also leaves the previous\n tool armed would be the confusing half of \"not implemented yet\". */}\n <Tooltip title=\"Sticky Note\">\n <IconButton\n variant=\"text gray\"\n onClick={() => onToolChange(\"select\")}\n {...hoverProps(\"sticky\")}\n >\n <NoteIcon />\n </IconButton>\n </Tooltip>\n <ToolButton\n tip=\"Text\"\n onClick={() => onToolChange(\"select\")}\n {...hoverProps(\"text\")}\n >\n <TextIcon />\n </ToolButton>\n <ToolButton\n tip=\"Draw\"\n onClick={() => onToolChange(\"select\")}\n {...hoverProps(\"draw\")}\n >\n <DrawIcon />\n </ToolButton>\n {/* Opening the family and arming its default member are one click: the\n pill appears with Rectangle already armed, so the next thing the\n pointer does can be the drawing itself. */}\n <ToolButton\n tip=\"Shape\"\n active={shapesOpen}\n onClick={() =>\n onToolChange(shapesOpen ? \"select\" : DEFAULT_SHAPE_TOOL)\n }\n {...hoverProps(\"shapes\")}\n >\n <ShapesIcon />\n </ToolButton>\n <ToolButton\n tip=\"Connect\"\n onClick={() => onToolChange(\"select\")}\n {...hoverProps(\"connector\")}\n >\n <ConnectionIcon />\n </ToolButton>\n <ToolButton\n tip=\"Project Elements\"\n active={projectElementsOpen}\n onClick={() =>\n onToolChange(\n projectElementsOpen ? \"select\" : DEFAULT_PROJECT_ELEMENT_TOOL\n )\n }\n {...hoverProps(\"projectElements\")}\n >\n <ProjectStarIcon />\n </ToolButton>\n <ToolButton\n tip=\"Link\"\n active={activeTool === \"link\"}\n onClick={() =>\n onToolChange(activeTool === \"link\" ? \"select\" : \"link\")\n }\n {...hoverProps(\"link\")}\n >\n <InsertLinkIcon />\n </ToolButton>\n <ToolButton\n tip=\"File\"\n active={activeTool === \"file\"}\n onClick={() =>\n onToolChange(activeTool === \"file\" ? \"select\" : \"file\")\n }\n {...hoverProps(\"file\")}\n >\n <AttachmentIcon />\n </ToolButton>\n </ToolSurface>\n\n <StyledHint color=\"tertiary\" className={hint ? undefined : \"hint-hidden\"}>\n {hint ?? \" \"}\n </StyledHint>\n </StyledBottomDock>\n );\n};\n"],"mappings":"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","ignoreList":[]}
|