@crisp-ui-kit/crisp 0.54.11 → 0.55.1
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/badge.css +1 -1
- package/dist/badge.layered.css +1 -1
- package/dist/cjs/components/badge/badge.recipe.js +10 -5
- package/dist/cjs/components/datatable/countries.js +73 -0
- package/dist/cjs/components/datatable/datatable.js +318 -40
- package/dist/cjs/components/datatable/datatable.recipe.js +18 -1
- package/dist/cjs/components/resizablepanel/resizablepanel.js +10 -1
- package/dist/cjs/components/table/table.js +8 -1
- package/dist/cjs/components/tabletoolbar/tabletoolbar.js +110 -27
- package/dist/cjs/index.js +0 -2
- package/dist/cjs/product/recordpage/index.js +6 -1
- package/dist/cjs/product/recordpage/recordpage.js +20 -4
- package/dist/datatable.css +141 -102
- package/dist/datatable.layered.css +141 -102
- package/dist/esm/components/badge/badge.recipe.js +10 -5
- package/dist/esm/components/datatable/countries.js +68 -0
- package/dist/esm/components/datatable/datatable.js +319 -41
- package/dist/esm/components/datatable/datatable.recipe.js +18 -1
- package/dist/esm/components/resizablepanel/resizablepanel.js +10 -1
- package/dist/esm/components/table/table.js +8 -1
- package/dist/esm/components/tabletoolbar/tabletoolbar.js +111 -28
- package/dist/esm/index.js +0 -2
- package/dist/esm/product/recordpage/index.js +2 -0
- package/dist/esm/product/recordpage/recordpage.js +20 -4
- package/dist/styles.css +142 -375
- package/dist/styles.layered.css +142 -375
- package/dist/types/components/badge/badge.recipe.d.ts +3 -1
- package/dist/types/components/datatable/countries.d.ts +12 -0
- package/dist/types/components/datatable/datatable.d.ts +27 -3
- package/dist/types/components/table/table.d.ts +14 -0
- package/dist/types/index.d.ts +0 -2
- package/dist/types/product/recordpage/index.d.ts +2 -0
- package/package.json +2 -12
- package/dist/cjs/product/recordstable/company-logos.js +0 -29
- package/dist/cjs/product/recordstable/index.js +0 -13
- package/dist/cjs/product/recordstable/recordstable.js +0 -1362
- package/dist/cjs/product/recordstable/recordstable.recipe.js +0 -175
- package/dist/cjs/product/recordstable/recordstable.tag.js +0 -26
- package/dist/cjs/product/taskstable/index.js +0 -7
- package/dist/cjs/product/taskstable/taskstable.js +0 -32
- package/dist/cjs/product/taskstable/taskstable.recipe.js +0 -56
- package/dist/esm/product/recordstable/company-logos.js +0 -26
- package/dist/esm/product/recordstable/index.js +0 -3
- package/dist/esm/product/recordstable/recordstable.js +0 -1322
- package/dist/esm/product/recordstable/recordstable.recipe.js +0 -172
- package/dist/esm/product/recordstable/recordstable.tag.js +0 -23
- package/dist/esm/product/taskstable/index.js +0 -2
- package/dist/esm/product/taskstable/taskstable.js +0 -29
- package/dist/esm/product/taskstable/taskstable.recipe.js +0 -53
- package/dist/recordstable.css +0 -240
- package/dist/recordstable.d.ts +0 -7
- package/dist/recordstable.layered.css +0 -242
- package/dist/taskstable.css +0 -30
- package/dist/taskstable.d.ts +0 -7
- package/dist/taskstable.layered.css +0 -32
- package/dist/types/product/recordstable/company-logos.d.ts +0 -1
- package/dist/types/product/recordstable/index.d.ts +0 -3
- package/dist/types/product/recordstable/recordstable.d.ts +0 -294
- package/dist/types/product/recordstable/recordstable.recipe.d.ts +0 -5
- package/dist/types/product/recordstable/recordstable.tag.d.ts +0 -15
- package/dist/types/product/taskstable/index.d.ts +0 -2
- package/dist/types/product/taskstable/taskstable.d.ts +0 -59
- package/dist/types/product/taskstable/taskstable.recipe.d.ts +0 -3
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.recordstableRecipe = void 0;
|
|
4
|
-
const tabletoolbar_chrome_1 = require("../../components/tabletoolbar/tabletoolbar.chrome");
|
|
5
|
-
const core_1 = require("../../core");
|
|
6
|
-
const tokens_1 = require("../../tokens");
|
|
7
|
-
const recordstable_tag_1 = require("./recordstable.tag");
|
|
8
|
-
// A record grid, measured: 36px rows, 1px borderSubtle (#eeeff1) grid
|
|
9
|
-
// lines on BOTH axes, sticky checkbox + entity (first) columns, entity = 16px
|
|
10
|
-
// avatar + 14px/500 name, 28px toolbar controls, a floating bulk-action bar.
|
|
11
|
-
//
|
|
12
|
-
// The toolbar's measured chrome now lives in the TableToolbar primitive
|
|
13
|
-
// (components/tabletoolbar/tabletoolbar.chrome.ts) and is emitted below under
|
|
14
|
-
// this surface's own class prefix, so RecordsTable's markup is unchanged. The
|
|
15
|
-
// three rules between the two halves are RecordsTable's own and must stay
|
|
16
|
-
// mid-block: they depend on following the .menu rule in source order.
|
|
17
|
-
const config = (0, core_1.defineRecipe)({
|
|
18
|
-
name: "recordstable",
|
|
19
|
-
base: `
|
|
20
|
-
box-sizing: border-box; position: relative; display: flex; flex-direction: column; min-height: 0; height: 100%; width: 100%; font-family: ${tokens_1.contract.font.sans}; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
|
|
21
|
-
& * { box-sizing: border-box; }
|
|
22
|
-
|
|
23
|
-
/* toolbar */
|
|
24
|
-
${(0, tabletoolbar_chrome_1.toolbarChromeHead)("recordstable")}
|
|
25
|
-
& .crisp-recordstable-ctx { z-index: 60; }
|
|
26
|
-
& .crisp-recordstable-th[data-drop] { box-shadow: inset 2px 0 0 ${tokens_1.contract.bgBrandSolid}; }
|
|
27
|
-
& .crisp-recordstable-th-inner[draggable="true"]:active { cursor: grabbing; }
|
|
28
|
-
${(0, tabletoolbar_chrome_1.toolbarChromeBody)("recordstable")}
|
|
29
|
-
|
|
30
|
-
/* scroll frame + table */
|
|
31
|
-
& .crisp-recordstable-scroll { flex: 1; min-height: 0; overflow: auto; background: ${tokens_1.contract.bgSurface}; border-top: 1px solid ${tokens_1.contract.borderSubtle}; scrollbar-width: thin; scrollbar-color: color-mix(in srgb, ${tokens_1.contract.fgPrimary} 22%, transparent) transparent; }
|
|
32
|
-
& .crisp-recordstable-scroll::-webkit-scrollbar { width: 10px; height: 10px; }
|
|
33
|
-
& .crisp-recordstable-scroll::-webkit-scrollbar-thumb { background: color-mix(in srgb, ${tokens_1.contract.fgPrimary} 20%, transparent); border-radius: ${tokens_1.contract.radius.full}; border: 2px solid ${tokens_1.contract.bgSurface}; background-clip: padding-box; }
|
|
34
|
-
& .crisp-recordstable-scroll::-webkit-scrollbar-thumb:hover { background: color-mix(in srgb, ${tokens_1.contract.fgPrimary} 34%, transparent); background-clip: padding-box; }
|
|
35
|
-
& .crisp-recordstable-scroll::-webkit-scrollbar-corner { background: transparent; }
|
|
36
|
-
& .crisp-recordstable-table { table-layout: fixed; border-collapse: separate; border-spacing: 0; }
|
|
37
|
-
& .crisp-recordstable-th, & .crisp-recordstable-td { position: relative; height: ${tokens_1.contract.size.tableRow}; padding: 0 ${tokens_1.contract.space["2"]}; border-bottom: 1px solid ${tokens_1.contract.borderSubtle}; border-inline-end: 1px solid ${tokens_1.contract.borderSubtle}; text-align: start; white-space: nowrap; overflow: hidden; }
|
|
38
|
-
& .crisp-recordstable-th { position: sticky; top: 0; z-index: 2; padding: 0; height: ${tokens_1.contract.size.tableHeader}; background: ${tokens_1.contract.bgSurface}; font-size: ${tokens_1.contract.text.lg}; font-weight: ${tokens_1.contract.weight.medium}; letter-spacing: -0.14px; color: color-mix(in srgb, ${tokens_1.contract.fgPrimary} 63%, transparent); user-select: none; }
|
|
39
|
-
& .crisp-recordstable-th-inner { display: flex; align-items: center; gap: ${tokens_1.contract.space["1.5"]}; width: 100%; height: 100%; margin: 0; padding: 0 ${tokens_1.contract.space["2"]}; border: none; background: none; color: inherit; font: inherit; letter-spacing: inherit; text-align: start; cursor: pointer; }
|
|
40
|
-
& .crisp-recordstable-th-inner svg { flex-shrink: 0; color: color-mix(in srgb, ${tokens_1.contract.fgPrimary} 45%, transparent); }
|
|
41
|
-
& .crisp-recordstable-th-label { flex: 1; overflow: hidden; text-overflow: ellipsis; }
|
|
42
|
-
& .crisp-recordstable-th-rename { width: 100%; min-width: 0; height: 100%; margin: 0; padding: 0; border: none; outline: none; background: none; color: inherit; font: inherit; letter-spacing: inherit; }
|
|
43
|
-
& .crisp-recordstable-th-rename:focus { box-shadow: inset 0 0 0 1px ${tokens_1.contract.bgBrandSolid}; }
|
|
44
|
-
& .crisp-recordstable-sort { flex-shrink: 0; opacity: 0.4; transition: opacity .12s; color: color-mix(in srgb, ${tokens_1.contract.fgPrimary} 45%, transparent); }
|
|
45
|
-
& .crisp-recordstable-th:hover .crisp-recordstable-sort, & .crisp-recordstable-th[data-sorted] .crisp-recordstable-sort { opacity: 1; }
|
|
46
|
-
& .crisp-recordstable-th[data-sorted="desc"] .crisp-recordstable-sort svg { transform: rotate(180deg); }
|
|
47
|
-
|
|
48
|
-
/* column resize handle */
|
|
49
|
-
& .crisp-recordstable-resize { position: absolute; top: 0; inset-inline-end: -3px; width: 9px; height: 100%; cursor: col-resize; z-index: 6; touch-action: none; }
|
|
50
|
-
& .crisp-recordstable-resize::after { content: ""; position: absolute; top: 0; inset-inline-start: 3px; width: 2px; height: 100%; background: ${tokens_1.contract.bgBrandSolid}; opacity: 0; transition: opacity .12s; }
|
|
51
|
-
& .crisp-recordstable-resize:hover::after, & .crisp-recordstable-resize[data-resizing]::after { opacity: 1; }
|
|
52
|
-
|
|
53
|
-
/* add-column header */
|
|
54
|
-
& .crisp-recordstable-addcol { min-width: 44px; }
|
|
55
|
-
& .crisp-recordstable-addcol button { display: flex; align-items: center; justify-content: center; width: 44px; height: 100%; border: none; background: none; color: ${tokens_1.contract.fgMuted}; cursor: pointer; }
|
|
56
|
-
& .crisp-recordstable-addcol button:hover { background: ${tokens_1.contract.bgRaised}; color: ${tokens_1.contract.fgPrimary}; }
|
|
57
|
-
|
|
58
|
-
/* cells */
|
|
59
|
-
/* font-weight is explicit because the first cell of each row is a
|
|
60
|
-
th[scope=row] — the record's name is what the row IS — and a th
|
|
61
|
-
defaults to bold. Measured before the change and unchanged after: 400. */
|
|
62
|
-
& .crisp-recordstable-td { font-size: ${tokens_1.contract.text.lg}; font-weight: ${tokens_1.contract.weight.regular}; color: ${tokens_1.contract.fgPrimary}; background: ${tokens_1.contract.bgSurface}; cursor: default; }
|
|
63
|
-
& .crisp-recordstable-td--editable { cursor: text; }
|
|
64
|
-
/* keyboard/click cell selection (spreadsheet-style) */
|
|
65
|
-
& .crisp-recordstable-td[data-selected] { outline: 2px solid ${tokens_1.contract.bgBrandSolid}; outline-offset: -2px; border-radius: ${tokens_1.contract.radius.sm}; z-index: 3; }
|
|
66
|
-
& .crisp-recordstable-scroll:focus { outline: none; }
|
|
67
|
-
/* picker cells (status / date / reference) host a ghost control edge-to-edge */
|
|
68
|
-
& .crisp-recordstable-td--picker { padding: 0; }
|
|
69
|
-
& .crisp-recordstable-td--picker .crisp-select-trigger, & .crisp-recordstable-td--picker .crisp-datepicker-trigger, & .crisp-recordstable-td--picker .crisp-multiselect-trigger { width: 100%; height: 100%; min-height: 0; border-radius: 0; box-shadow: none; padding: 0 ${tokens_1.contract.space["2"]}; }
|
|
70
|
-
& .crisp-recordstable-td--picker .crisp-multiselect-trigger:hover { background: none; }
|
|
71
|
-
& .crisp-recordstable-td--picker .crisp-multiselect-trigger[data-open] { box-shadow: inset 0 0 0 1.5px ${tokens_1.contract.bgBrandSolid}; }
|
|
72
|
-
/* tag cell: one compact clipped line of full chips, no chevron (opens the picker on click) */
|
|
73
|
-
& .crisp-recordstable-td--picker .crisp-multiselect-chips { flex-wrap: nowrap; overflow: hidden; }
|
|
74
|
-
& .crisp-recordstable-td--picker .crisp-multiselect-chips .crisp-recordstable-tag { flex-shrink: 0; max-width: none; }
|
|
75
|
-
& .crisp-recordstable-td--picker .crisp-multiselect-chevron { display: none; }
|
|
76
|
-
& .crisp-recordstable-td--picker .crisp-multiselect-placeholder { color: ${tokens_1.contract.fgMuted}; }
|
|
77
|
-
/* reference picker: a leading 16px avatar per option, plus a trailing
|
|
78
|
-
"Create X" row when the consumer supplies one (#449) -- measured live
|
|
79
|
-
against Attio's own picker (16px circular avatar, 16px plain icon for
|
|
80
|
-
the create row, both sitting in the option's existing 8px gap, no new
|
|
81
|
-
gap value invented). */
|
|
82
|
-
& .crisp-recordstable-refoption { display: flex; align-items: center; gap: ${tokens_1.contract.space["2"]}; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
|
|
83
|
-
& .crisp-recordstable-refoption-avatar { flex-shrink: 0; }
|
|
84
|
-
& .crisp-recordstable-refoption--create { color: ${tokens_1.contract.fgMuted}; }
|
|
85
|
-
& .crisp-recordstable-status { display: inline-flex; align-items: center; gap: ${tokens_1.contract.space["1.5"]}; min-width: 0; }
|
|
86
|
-
& .crisp-recordstable-status-dot { flex-shrink: 0; width: 8px; height: 8px; border-radius: ${tokens_1.contract.radius.full}; }
|
|
87
|
-
& .crisp-recordstable-cell { display: flex; align-items: center; gap: ${tokens_1.contract.space["2"]}; height: 100%; min-width: 0; }
|
|
88
|
-
& .crisp-recordstable-cell--num { justify-content: flex-end; font-variant-numeric: tabular-nums; }
|
|
89
|
-
& .crisp-recordstable-cell--tags { gap: ${tokens_1.contract.space["1"]}; }
|
|
90
|
-
${recordstable_tag_1.recordTagCss}
|
|
91
|
-
& .crisp-recordstable-muted { color: ${tokens_1.contract.fgMuted}; }
|
|
92
|
-
& .crisp-recordstable-entity { display: flex; align-items: center; gap: ${tokens_1.contract.space["1.5"]}; min-width: 0; color: ${tokens_1.contract.fgPrimary}; font-weight: ${tokens_1.contract.weight.medium}; text-decoration: none; }
|
|
93
|
-
& .crisp-recordstable-entity:hover .crisp-recordstable-entity-name { text-decoration: underline; }
|
|
94
|
-
& .crisp-recordstable-entity-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
95
|
-
& button.crisp-recordstable-entity-name--link { margin: 0; padding: 0; border: none; background: none; font: inherit; color: inherit; letter-spacing: inherit; text-align: start; cursor: pointer; max-width: 100%; }
|
|
96
|
-
& .crisp-recordstable-fav { width: ${tokens_1.contract.size.icon}; height: ${tokens_1.contract.size.icon}; border-radius: ${tokens_1.contract.radius.sm}; flex-shrink: 0; object-fit: cover; background: ${tokens_1.contract.bgRaised}; }
|
|
97
|
-
& .crisp-recordstable-open { position: absolute; inset-inline-end: ${tokens_1.contract.space["1"]}; top: 50%; transform: translateY(-50%); display: inline-flex; align-items: center; justify-content: center; width: 24px; height: 24px; padding: 0; border: none; border-radius: ${tokens_1.contract.radius.sm}; background: ${tokens_1.contract.bgSurface}; box-shadow: inset 0 0 0 1px ${tokens_1.contract.borderDefault}; color: ${tokens_1.contract.fgMuted}; font-family: inherit; cursor: pointer; opacity: 0; transition: opacity .12s, background-color .12s; z-index: 3; }
|
|
98
|
-
& .crisp-recordstable-open:hover { background: ${tokens_1.contract.bgRaised}; color: ${tokens_1.contract.fgPrimary}; }
|
|
99
|
-
& tbody tr:hover .crisp-recordstable-open { opacity: 1; }
|
|
100
|
-
& .crisp-recordstable-link { color: ${tokens_1.contract.fgPrimary}; text-decoration: none; overflow: hidden; text-overflow: ellipsis; }
|
|
101
|
-
& .crisp-recordstable-link:hover { text-decoration: underline; }
|
|
102
|
-
|
|
103
|
-
/* inline edit input */
|
|
104
|
-
& .crisp-recordstable-edit { position: absolute; inset: 0; width: 100%; height: 100%; margin: 0; padding: 0 ${tokens_1.contract.space["2"]}; border: none; outline: 2px solid ${tokens_1.contract.bgBrandSolid}; outline-offset: -2px; border-radius: ${tokens_1.contract.radius.sm}; background: ${tokens_1.contract.bgSurface}; font-family: inherit; font-size: ${tokens_1.contract.text.lg}; color: ${tokens_1.contract.fgPrimary}; z-index: 5; }
|
|
105
|
-
& .crisp-recordstable-edit--num { text-align: end; font-variant-numeric: tabular-nums; }
|
|
106
|
-
|
|
107
|
-
/* selection / hover / sticky */
|
|
108
|
-
& .crisp-recordstable-col-check { width: 40px; min-width: 40px; padding: 0; }
|
|
109
|
-
& .crisp-recordstable-check-inner { display: flex; align-items: center; justify-content: center; height: 100%; }
|
|
110
|
-
& .crisp-recordstable-col-check, & .crisp-recordstable-col-entity { position: sticky; z-index: 3; background: ${tokens_1.contract.bgSurface}; }
|
|
111
|
-
/* The sticky pin is a LOGICAL offset: with physical \`left\` these columns
|
|
112
|
-
were not pinned at all under RTL -- scrolled, they left the viewport
|
|
113
|
-
entirely (measured: viewport 13..773, check column at x=1333). Nothing in
|
|
114
|
-
JS measures these, so converting them is safe; the two properties below
|
|
115
|
-
that have no logical form get an explicit RTL rule rather than being
|
|
116
|
-
left to point the wrong way. */
|
|
117
|
-
& .crisp-recordstable-col-check { inset-inline-start: 0; }
|
|
118
|
-
& .crisp-recordstable-col-entity { inset-inline-start: 40px; clip-path: inset(0 -38px 0 0); transition: box-shadow .2s ease; }
|
|
119
|
-
[dir="rtl"] & .crisp-recordstable-col-entity { clip-path: inset(0 0 0 -38px); }
|
|
120
|
-
& thead .crisp-recordstable-col-check, & thead .crisp-recordstable-col-entity { z-index: 4; }
|
|
121
|
-
/* soft shadow on the sticky column edge once the grid is scrolled horizontally */
|
|
122
|
-
& .crisp-recordstable-scroll[data-scrolled] .crisp-recordstable-col-entity { box-shadow: 6px 0 16px 4px rgba(0,0,0,0.12); }
|
|
123
|
-
/* box-shadow has no logical form either: the bleed follows the scrolled
|
|
124
|
-
content, which is the opposite side under RTL. */
|
|
125
|
-
[dir="rtl"] & .crisp-recordstable-scroll[data-scrolled] .crisp-recordstable-col-entity { box-shadow: -6px 0 16px 4px rgba(0,0,0,0.12); }
|
|
126
|
-
/* AI-enriched values carry a purple wash. Measured live:
|
|
127
|
-
a full-bleed overlay at #9b69ff 4% (== bgPurple), composited OVER
|
|
128
|
-
whatever row-state background the cell already has, which is why it
|
|
129
|
-
is an ::after and not a background. */
|
|
130
|
-
& .crisp-recordstable-td[data-enriched]::after { content: ""; position: absolute; inset: 0; pointer-events: none; background: color-mix(in srgb, ${tokens_1.contract.bgPurple} 4%, transparent); }
|
|
131
|
-
& tbody tr:hover .crisp-recordstable-td { background: color-mix(in srgb, ${tokens_1.contract.fgPrimary} 4%, ${tokens_1.contract.bgSurface}); }
|
|
132
|
-
& tbody tr[data-selected] .crisp-recordstable-td { background: color-mix(in srgb, ${tokens_1.contract.bgBrandSolid} 10%, ${tokens_1.contract.bgSurface}); }
|
|
133
|
-
& tbody tr[data-selected]:hover .crisp-recordstable-td { background: color-mix(in srgb, ${tokens_1.contract.fgPrimary} 4%, color-mix(in srgb, ${tokens_1.contract.bgBrandSolid} 10%, ${tokens_1.contract.bgSurface})); }
|
|
134
|
-
& .crisp-recordstable-th:last-child, & .crisp-recordstable-td:last-child { border-inline-end: none; }
|
|
135
|
-
|
|
136
|
-
/* add-row footer */
|
|
137
|
-
& .crisp-recordstable-addrow { display: flex; align-items: center; gap: ${tokens_1.contract.space["2"]}; width: 100%; height: ${tokens_1.contract.size.tableRow}; padding: 0 ${tokens_1.contract.space["2"]}; border: none; border-top: 1px solid ${tokens_1.contract.borderSubtle}; background: ${tokens_1.contract.bgSurface}; color: ${tokens_1.contract.fgMuted}; font-family: inherit; font-size: ${tokens_1.contract.text.lg}; cursor: pointer; }
|
|
138
|
-
& .crisp-recordstable-addrow:hover { background: ${tokens_1.contract.bgRaised}; color: ${tokens_1.contract.fgPrimary}; }
|
|
139
|
-
/* zero-row empty state — centred in the body region (headers + summary stay) */
|
|
140
|
-
& .crisp-recordstable-empty { display: flex; align-items: center; justify-content: center; min-height: 320px; padding: ${tokens_1.contract.space["8"]} ${tokens_1.contract.space["4"]}; }
|
|
141
|
-
|
|
142
|
-
/* summary footer — per-column aggregation, sticky to the bottom */
|
|
143
|
-
& .crisp-recordstable-sum { position: sticky; bottom: 0; z-index: 2; height: ${tokens_1.contract.size.tableRow}; padding: 0; border-top: 1px solid ${tokens_1.contract.borderSubtle}; border-bottom: 1px solid ${tokens_1.contract.borderSubtle}; border-inline-end: 1px solid ${tokens_1.contract.borderSubtle}; background: ${tokens_1.contract.bgSurface}; }
|
|
144
|
-
& tfoot .crisp-recordstable-col-check, & tfoot .crisp-recordstable-col-entity { position: sticky; bottom: 0; z-index: 3; }
|
|
145
|
-
& .crisp-recordstable-sum:last-child { border-inline-end: none; }
|
|
146
|
-
& .crisp-recordstable-sum-btn { display: flex; align-items: center; justify-content: flex-end; gap: ${tokens_1.contract.space["1.5"]}; width: 100%; height: 100%; margin: 0; padding: 0 ${tokens_1.contract.space["3"]}; border: none; background: none; color: color-mix(in srgb, ${tokens_1.contract.fgPrimary} 63%, transparent); font-family: inherit; font-size: ${tokens_1.contract.text.lg}; font-weight: ${tokens_1.contract.weight.medium}; cursor: pointer; white-space: nowrap; overflow: hidden; }
|
|
147
|
-
& .crisp-recordstable-sum-btn:hover { background: ${tokens_1.contract.bgRaised}; }
|
|
148
|
-
& .crisp-recordstable-sum-label { color: color-mix(in srgb, ${tokens_1.contract.fgPrimary} 45%, transparent); text-transform: capitalize; }
|
|
149
|
-
& .crisp-recordstable-sum-value { color: ${tokens_1.contract.fgPrimary}; font-variant-numeric: tabular-nums; overflow: hidden; text-overflow: ellipsis; }
|
|
150
|
-
& .crisp-recordstable-sumgroup { width: 100%; height: 100%; }
|
|
151
|
-
& .crisp-recordstable-pin { flex-shrink: 0; margin-inline-start: ${tokens_1.contract.space["1"]}; color: ${tokens_1.contract.bgWarning}; fill: color-mix(in srgb, ${tokens_1.contract.bgWarning} 35%, transparent); }
|
|
152
|
-
& .crisp-recordstable-sum-btn[data-empty] { opacity: 0; justify-content: flex-start; }
|
|
153
|
-
& .crisp-recordstable-sum-btn[data-empty]:hover { opacity: 1; }
|
|
154
|
-
|
|
155
|
-
/* bulk action bar lives in its own component now — see components/bulkbar */
|
|
156
|
-
& .crisp-recordstable-bulk-sep { width: 1px; height: 20px; margin: 0 ${tokens_1.contract.space["0.5"]}; background: ${tokens_1.contract.borderSubtle}; }
|
|
157
|
-
& .crisp-recordstable-bulk-close { display: inline-flex; align-items: center; justify-content: center; width: 32px; height: 32px; padding: 0; border: none; border-radius: ${tokens_1.contract.radius.md}; background: transparent; color: ${tokens_1.contract.fgMuted}; cursor: pointer; }
|
|
158
|
-
& .crisp-recordstable-bulk-close:hover { background: ${tokens_1.contract.bgRaised}; color: ${tokens_1.contract.fgPrimary}; }
|
|
159
|
-
|
|
160
|
-
/* announced, never drawn */
|
|
161
|
-
& .crisp-recordstable-live {
|
|
162
|
-
position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
|
|
163
|
-
overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
${core_1.rtlFlipCss}
|
|
167
|
-
`,
|
|
168
|
-
variants: {},
|
|
169
|
-
defaultVariants: {},
|
|
170
|
-
compoundVariants: [],
|
|
171
|
-
});
|
|
172
|
-
exports.recordstableRecipe = Object.assign((0, core_1.resolveRecipe)(config), {
|
|
173
|
-
config,
|
|
174
|
-
});
|
|
175
|
-
exports.default = config;
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.recordTagCss = void 0;
|
|
4
|
-
const tokens_1 = require("../../tokens");
|
|
5
|
-
/**
|
|
6
|
-
* The record tag/chip, measured live: 22px tall, `padding: 0 4px`,
|
|
7
|
-
* `border-radius: ${c.radius.chip}`, 14px/20px at weight 500, and a 1px inset ring in the
|
|
8
|
-
* tone's colour.
|
|
9
|
-
*
|
|
10
|
-
* Its own module (not pasted into `recordstable.recipe.ts`) because it used
|
|
11
|
-
* to be shared with `RecordPanel`'s own Details field list too, and the two
|
|
12
|
-
* copies had already started to drift before that sharing existed — adding
|
|
13
|
-
* the measured inset ring meant patching the same rules twice. `RecordPanel`
|
|
14
|
-
* no longer renders a Details list (#448, Attio's own peek doesn't have
|
|
15
|
-
* one), so `RecordsTable` is this module's only consumer now; kept as its
|
|
16
|
-
* own file rather than folded back in, since a second consumer showing up
|
|
17
|
-
* again is exactly how the drift happened the first time.
|
|
18
|
-
*/
|
|
19
|
-
exports.recordTagCss = `& .crisp-recordstable-tag { display: inline-flex; align-items: center; height: ${tokens_1.contract.size.chip}; padding: 0 ${tokens_1.contract.space["1"]}; border-radius: ${tokens_1.contract.radius.chip}; font-size: ${tokens_1.contract.text.lg}; line-height: 20px; font-weight: ${tokens_1.contract.weight.medium}; white-space: nowrap; background: color-mix(in srgb, ${tokens_1.contract.fgPrimary} 6%, transparent); color: color-mix(in srgb, ${tokens_1.contract.fgPrimary} 82%, transparent); box-shadow: inset 0 0 0 1px ${tokens_1.contract.borderSubtle}; }
|
|
20
|
-
& .crisp-recordstable-tag[data-tone="brand"] { background: color-mix(in srgb, ${tokens_1.contract.bgBrandSolid} 14%, transparent); color: color-mix(in srgb, ${tokens_1.contract.bgBrandSolid} 82%, ${tokens_1.contract.fgPrimary}); box-shadow: inset 0 0 0 1px color-mix(in srgb, ${tokens_1.contract.bgBrandSolid} 30%, transparent); }
|
|
21
|
-
& .crisp-recordstable-tag[data-tone="success"] { background: color-mix(in srgb, ${tokens_1.contract.bgSuccess} 16%, transparent); color: color-mix(in srgb, ${tokens_1.contract.bgSuccess} 78%, ${tokens_1.contract.fgPrimary}); box-shadow: inset 0 0 0 1px color-mix(in srgb, ${tokens_1.contract.bgSuccess} 30%, transparent); }
|
|
22
|
-
& .crisp-recordstable-tag[data-tone="warning"] { background: color-mix(in srgb, ${tokens_1.contract.bgWarning} 18%, transparent); color: color-mix(in srgb, ${tokens_1.contract.bgWarning} 82%, ${tokens_1.contract.fgPrimary}); box-shadow: inset 0 0 0 1px color-mix(in srgb, ${tokens_1.contract.bgWarning} 30%, transparent); }
|
|
23
|
-
& .crisp-recordstable-tag[data-tone="danger"] { background: color-mix(in srgb, ${tokens_1.contract.bgDanger} 15%, transparent); color: color-mix(in srgb, ${tokens_1.contract.bgDanger} 80%, ${tokens_1.contract.fgPrimary}); box-shadow: inset 0 0 0 1px color-mix(in srgb, ${tokens_1.contract.bgDanger} 30%, transparent); }
|
|
24
|
-
& .crisp-recordstable-tag[data-tone="purple"] { background: color-mix(in srgb, ${tokens_1.contract.bgPurple} 16%, transparent); color: color-mix(in srgb, ${tokens_1.contract.bgPurple} 80%, ${tokens_1.contract.fgPrimary}); box-shadow: inset 0 0 0 1px color-mix(in srgb, ${tokens_1.contract.bgPurple} 30%, transparent); }
|
|
25
|
-
& .crisp-recordstable-tag[data-tone="cyan"] { background: color-mix(in srgb, ${tokens_1.contract.bgCyan} 18%, transparent); color: color-mix(in srgb, ${tokens_1.contract.bgCyan} 82%, ${tokens_1.contract.fgPrimary}); box-shadow: inset 0 0 0 1px color-mix(in srgb, ${tokens_1.contract.bgCyan} 30%, transparent); }
|
|
26
|
-
& .crisp-recordstable-tag[data-tone="orange"] { background: color-mix(in srgb, ${tokens_1.contract.bgOrange} 16%, transparent); color: color-mix(in srgb, ${tokens_1.contract.bgOrange} 82%, ${tokens_1.contract.fgPrimary}); box-shadow: inset 0 0 0 1px color-mix(in srgb, ${tokens_1.contract.bgOrange} 30%, transparent); }`;
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.taskstableRecipe = exports.TasksTable = void 0;
|
|
4
|
-
var taskstable_1 = require("./taskstable");
|
|
5
|
-
Object.defineProperty(exports, "TasksTable", { enumerable: true, get: function () { return taskstable_1.TasksTable; } });
|
|
6
|
-
var taskstable_recipe_1 = require("./taskstable.recipe");
|
|
7
|
-
Object.defineProperty(exports, "taskstableRecipe", { enumerable: true, get: function () { return taskstable_recipe_1.taskstableRecipe; } });
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.TasksTable = TasksTable;
|
|
4
|
-
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
-
const core_1 = require("../../core");
|
|
6
|
-
const listpage_1 = require("../listpage");
|
|
7
|
-
const taskstable_recipe_1 = require("./taskstable.recipe");
|
|
8
|
-
function Cell({ flex, className, children, }) {
|
|
9
|
-
return ((0, jsx_runtime_1.jsx)("span", { className: (0, core_1.cx)("crisp-taskstable-cell", className), style: { flex }, children: children }));
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* A grouped due-date table pattern — Attio's Tasks page. Composes
|
|
13
|
-
* `ListPage`'s toolbar and group-row chrome (both class-compatible; see
|
|
14
|
-
* taskstable.recipe.ts) with a typed column/cell layer: a title+checkbox
|
|
15
|
-
* row grouped into due-date sections, a due-date cell that goes red past
|
|
16
|
-
* due, and consumer-supplied record/assignee chip slots.
|
|
17
|
-
*
|
|
18
|
-
* @deprecated Reach for `DataTable`'s `groupBy` instead — a single
|
|
19
|
-
* Attio-exact records grid replaces the separate table variants.
|
|
20
|
-
* `TasksTable` has no consumers left (checked GRC and the fms/Mercury
|
|
21
|
-
* admin) and is slated for removal in a future minor.
|
|
22
|
-
*/
|
|
23
|
-
function TasksTable({ columns, groups, leading, trailing, emptyLabel: emptyLabelProp, completeLabel: completeLabelProp, incompleteLabel: incompleteLabelProp, className, ...rest }) {
|
|
24
|
-
const crispMessages = (0, core_1.useCrispMessages)();
|
|
25
|
-
const emptyLabel = emptyLabelProp ?? crispMessages["No tasks"] ?? "No tasks";
|
|
26
|
-
const completeLabel = (0, core_1.useCrispMessage)(completeLabelProp, "Mark complete");
|
|
27
|
-
const incompleteLabel = (0, core_1.useCrispMessage)(incompleteLabelProp, "Mark incomplete");
|
|
28
|
-
const flexOf = (key) => columns.find((col) => col.key === key)?.flex ?? 1;
|
|
29
|
-
const total = groups.reduce((s, g) => s + g.rows.length, 0);
|
|
30
|
-
return ((0, jsx_runtime_1.jsxs)("div", { className: (0, core_1.cx)((0, taskstable_recipe_1.taskstableRecipe)({ className }), (0, listpage_1.listpageRecipe)()), ...rest, children: [(0, jsx_runtime_1.jsxs)("div", { className: "crisp-listpage-toolbar", children: [(0, jsx_runtime_1.jsx)("div", { className: "crisp-listpage-toolbar-lead", children: leading }), trailing != null && ((0, jsx_runtime_1.jsx)("div", { className: "crisp-listpage-toolbar-trail", children: trailing }))] }), (0, jsx_runtime_1.jsxs)("div", { className: "crisp-listpage-body", children: [(0, jsx_runtime_1.jsx)("div", { className: "crisp-taskstable-colhead", children: columns.map((col) => ((0, jsx_runtime_1.jsxs)("span", { className: "crisp-taskstable-colhead-cell", style: { flex: col.flex ?? 1 }, children: [col.icon, col.label] }, col.key))) }), total === 0 ? ((0, jsx_runtime_1.jsx)("div", { className: "crisp-taskstable-empty", children: emptyLabel })) : (groups.map((g) => ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsxs)("div", { className: "crisp-listpage-group", children: [g.label, (0, jsx_runtime_1.jsx)("span", { className: "crisp-listpage-group-count", children: g.count })] }), g.rows.map((row) => ((0, jsx_runtime_1.jsx)(listpage_1.ListRow, { children: (0, jsx_runtime_1.jsxs)("div", { className: "crisp-taskstable-row", style: { flex: 1 }, children: [(0, jsx_runtime_1.jsxs)(Cell, { flex: flexOf("title"), children: [(0, jsx_runtime_1.jsx)("input", { type: "checkbox", className: "crisp-taskstable-check", checked: !!row.done, "aria-label": row.done ? incompleteLabel : completeLabel, onChange: () => row.onToggle?.(!row.done) }), (0, jsx_runtime_1.jsx)("span", { className: "crisp-taskstable-title", children: row.title })] }), (0, jsx_runtime_1.jsx)(Cell, { flex: flexOf("due"), children: row.due != null && ((0, jsx_runtime_1.jsx)("span", { className: "crisp-taskstable-due", "data-overdue": row.due.overdue ? "" : undefined, children: row.due.label })) }), (0, jsx_runtime_1.jsx)(Cell, { flex: flexOf("record"), children: row.record }), (0, jsx_runtime_1.jsx)(Cell, { flex: flexOf("assignee"), children: row.assignee })] }) }, row.id)))] }, g.id))))] })] }));
|
|
31
|
-
}
|
|
32
|
-
TasksTable.displayName = "TasksTable";
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.taskstableRecipe = void 0;
|
|
4
|
-
const core_1 = require("../../core");
|
|
5
|
-
const tokens_1 = require("../../tokens");
|
|
6
|
-
// A grouped due-date table — Attio's Tasks page (app.attio.com/<ws>/tasks),
|
|
7
|
-
// measured live and recorded on crisp#462. Composes ListPage's own toolbar
|
|
8
|
-
// (`.crisp-listpage-toolbar`) and group-row (`.crisp-listpage-group`) chrome
|
|
9
|
-
// by carrying BOTH this recipe's root class and `listpageRecipe`'s root class
|
|
10
|
-
// on the same element (see taskstable.tsx) -- both recipes' descendant rules
|
|
11
|
-
// nest under their own root class, so this is a safe, ordinary composition,
|
|
12
|
-
// the same way `<ListRow>` already lets a caller compose into `ListPage`'s
|
|
13
|
-
// group bodies. Real deviation: ListPage's own `columns` colhead slot is
|
|
14
|
-
// pinned to `c.size.menuRow` (32px, correct for its Reports/Sequences
|
|
15
|
-
// reference surfaces per #479) but Tasks/Notes independently measure a 49px
|
|
16
|
-
// column-header row (#462) -- ListPage's colhead can't be asked to render at
|
|
17
|
-
// a different height per consumer today, so this component renders its own
|
|
18
|
-
// colhead instead of using that slot. Flagged in the PR, not fixed here (out
|
|
19
|
-
// of scope: don't change ListPage for this component).
|
|
20
|
-
const config = (0, core_1.defineRecipe)({
|
|
21
|
-
name: "taskstable",
|
|
22
|
-
base: `display: flex; flex-direction: column; min-height: 0; box-sizing: border-box; font-family: ${tokens_1.contract.font.sans}; color: ${tokens_1.contract.fgPrimary};
|
|
23
|
-
-webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
|
|
24
|
-
|
|
25
|
-
& .crisp-taskstable-colhead { display: flex; align-items: center; gap: ${tokens_1.contract.space["1.5"]}; min-height: 49px; max-height: 49px; padding: ${tokens_1.contract.space["2.5"]} ${tokens_1.contract.space["3"]}; box-shadow: inset 0 -1px 0 ${tokens_1.contract.borderSubtle}; font-size: ${tokens_1.contract.text.sm}; color: ${tokens_1.contract.fgMuted}; }
|
|
26
|
-
& .crisp-taskstable-colhead-cell { display: inline-flex; align-items: center; gap: ${tokens_1.contract.space["1.5"]}; min-width: 0; }
|
|
27
|
-
|
|
28
|
-
& .crisp-taskstable-row { display: flex; align-items: center; gap: ${tokens_1.contract.space["1.5"]}; }
|
|
29
|
-
/* #642: measured live -- title, due date and assignee name are ALL
|
|
30
|
-
14px/500 on Attio's own Tasks page. Only -title/-due set their own
|
|
31
|
-
font-size (and only -title its own weight), so an unstyled consumer
|
|
32
|
-
slot (a plain PersonChip/RecordChip name span with no font-size of
|
|
33
|
-
its own) fell through to the browser/body default, 16px/400. Set
|
|
34
|
-
the ambient font here so it cascades to any slot content that
|
|
35
|
-
doesn't override it -- -title/-due's own declarations still apply,
|
|
36
|
-
unchanged, they're just now redundant with this baseline rather
|
|
37
|
-
than the only source of it. */
|
|
38
|
-
& .crisp-taskstable-cell { display: flex; align-items: center; min-width: 0; font-size: ${tokens_1.contract.text.lg}; font-weight: ${tokens_1.contract.weight.medium}; }
|
|
39
|
-
|
|
40
|
-
& .crisp-taskstable-check { appearance: none; -webkit-appearance: none; box-sizing: border-box; flex-shrink: 0; margin: 0; width: 16px; height: 16px; border: none; border-radius: ${tokens_1.contract.radius.full}; background: ${tokens_1.contract.bgSurface}; box-shadow: inset 0 0 0 1px color-mix(in srgb, ${tokens_1.contract.fgPrimary} 9%, transparent); cursor: pointer; transition: background-color .12s, box-shadow .12s; }
|
|
41
|
-
& .crisp-taskstable-check:hover { box-shadow: inset 0 0 0 1px color-mix(in srgb, ${tokens_1.contract.fgPrimary} 30%, transparent); }
|
|
42
|
-
& .crisp-taskstable-check:checked { background: ${tokens_1.contract.bgBrandSolid} center / 10px no-repeat; box-shadow: none; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12' fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M2.5 6.5 5 9l4.5-5'/%3E%3C/svg%3E"); }
|
|
43
|
-
& .crisp-taskstable-check:focus-visible { outline: 2px solid ${tokens_1.contract.bgBrandSolid}; outline-offset: 1px; }
|
|
44
|
-
|
|
45
|
-
& .crisp-taskstable-title { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: ${tokens_1.contract.text.lg}; font-weight: ${tokens_1.contract.weight.medium}; color: ${tokens_1.contract.fgPrimary}; }
|
|
46
|
-
|
|
47
|
-
& .crisp-taskstable-due { font-size: ${tokens_1.contract.text.lg}; color: ${tokens_1.contract.fgMuted}; white-space: nowrap; }
|
|
48
|
-
& .crisp-taskstable-due[data-overdue] { color: ${tokens_1.contract.fgDanger}; }
|
|
49
|
-
|
|
50
|
-
& .crisp-taskstable-empty { padding: ${tokens_1.contract.space["8"]} ${tokens_1.contract.space["4"]}; text-align: center; font-size: ${tokens_1.contract.text.md}; color: ${tokens_1.contract.fgMuted}; }`,
|
|
51
|
-
variants: {},
|
|
52
|
-
defaultVariants: {},
|
|
53
|
-
compoundVariants: [],
|
|
54
|
-
});
|
|
55
|
-
exports.taskstableRecipe = (0, core_1.resolveRecipe)(config);
|
|
56
|
-
exports.default = config;
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
// Clean, self-contained brand-mark data URIs for the built-in demo dataset
|
|
2
|
-
// (defaultRows below). Each PNG is a real favicon, fetched once from
|
|
3
|
-
// Google's public favicon service, then hard-thresholded on alpha (<128
|
|
4
|
-
// -> fully transparent, >=128 -> fully opaque) before being baked in here.
|
|
5
|
-
//
|
|
6
|
-
// Why: those source PNGs anti-alias their edges against an assumed white
|
|
7
|
-
// canvas, so boundary pixels come back literally white-colored at partial
|
|
8
|
-
// alpha even though the corners are properly transparent. On a light page
|
|
9
|
-
// that blends in invisibly; on dark rows it reads as a white halo/outline
|
|
10
|
-
// around every logo. Thresholding removes that halo. It does NOT remove a
|
|
11
|
-
// company's own opaque branding (e.g. Google's white circle, Notion's
|
|
12
|
-
// white backing, OpenAI/Anthropic's light square) — those pixels are fully
|
|
13
|
-
// opaque real brand-icon content, not an artifact, and are left as-is.
|
|
14
|
-
//
|
|
15
|
-
// Baking these in as data URIs (instead of the live s2/favicons URL) also
|
|
16
|
-
// means the demo never depends on a live network request.
|
|
17
|
-
export const companyLogos = {
|
|
18
|
-
"google.com": "data:image/png;base64,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",
|
|
19
|
-
"stripe.com": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAACzklEQVR42u2az24SURTGv3M7BdsoRUKopcUqiU2jMRpbJWl0V7vqzufxDUx8Ct/AhakkbozJaGNq/JPGGkwL0tIgUmqk0OFeFzgMA5gopcDMnLOCS1h8v++7597JGUrMPUNzTQYTEMKnRsQY3FQ1WYaUVcoVddu6aP4SCy+rUW3CdeIBYESMYVSbULHwsuoIYCa8opSdhytLQWAmvKJsAFqpeKFMzWIymIAXnO+UhHq/Ez7Pud+Iv/Ap4caG9z+NUcDjxQAYAANgAAzAySWNk11jNKeJNQzgV8Fam5kn/Cy5EIApFqgL/pGuf75+n3BvFZiNE24m6muPHyrkdhSERs4FUD1SNmfHQ0AoQrh2xxI7FQXOBez/O/zjvmEAPs0hCWiOsuns+RhwZZEQvwrcvkuIxjoL7nVpg3A3EAGm44T4qiX20mXA5++/GVq/3F1cIdxaIkSi6Ju7pw7gb135wkU0xC4khkNozwFUjxS+vWvvylNRwO8fTJz7BkAaCtNxwqMnhLn5FjAV54jv+iZons9T0fbfnCSenwUYAANgAAyAATAABsAAGAADYAAMgAEwAAbAAJxcmuby2WC1AlQqwG4WyKaBNy8VUp+ArXWF8RDgO0PuA3BYqgve0IG3rxT2doDCfvuQpZuZ4FABaHZ3Qwe2Uwp6EviqW6Pv6RtW1INRctZorFN93rSi/H0P+PIBKGaVbTg6u3Ayd4cCgBnjbBrYzwIvnipsrSvb2Gw81HtnBwaged9upxQ+vgZKBYXSPmzuDkJszwCYR85utl3s++dWjAft7r8UPViSXb9kczYAZDbt+1bTTn/fDs0WKBXU0Drbl5ugk5zmZwEGwAAYAANgAB0A1GTZs+JrsgwhZZW8CkDKKolcUQdBek48QSJX1Os9IJ1Pei4FpuZGE8zk18gLSSBIZPJr1PEUSOeTdGwckBsbY02WcWwcUGvafwM6ARIBbCv6CwAAAABJRU5ErkJggg==",
|
|
20
|
-
"figma.com": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAADAUlEQVR42u2bP0+TURTGf0/BNIGWqoMuDsYQpi4GTGtY3BQ3ln4EdwIDTKSTLJbZz+Dgnxj0G2CxboZBcOEjFJrwLx4HCokRor3v5fa273vHpr1vz3Of85xznt7KzEjzypHyNepll3IZikVwodNsD+8VYIBJlPZh9XsEDKhWoVAwQuTS+RNkRnvcWHqceEs5f+9aDfb2kgc96wGYiaZYtcAM8BG8r9WuWtgUqFYjkzKDpUogAMpliLF2mox6OQAAxSJIcda09ngAAOLunCzdjZADM4cLAMta4QyADIBrB0Cx1kBA6PoBODmJ9ziLBwEY0GrFyQJDLuOxmwZsbsZX/xpfAotgs6lYEp+JLYV3hM46YlGpgGR9o31js89lsNmE01NhJoKMCXam9gencqW9d0+w/qBF/rjbivZIxuVXf39CH4GRK5rb81c6Tp2vfwaszUP+6MyqxIMq6DMw0t3vKmNUGAVMG/SPAW9q8POoG7SPwN8AhR4PVZg2kD3vAwMugvfWxDgyWpg+BQZgbd7PqV/EsEHShHZOh54BqNfADG9yrw/dnE7eDpjqATQgf+y5qt3wuFclAAMMf6fv7uNcudP1e4IRD8OBRNAyRygDgFS7wvFKYBgGKIdvGRSD5AneuuM5/DGPe80FYMCL12AepwB74nZyl0Ti5Mo4ieDKe6+jAPYscSLIngauAocPPWvBvjMPZHP9uCPUXS/nQQmGo+V3f4bdHW0tRPBe+oCVt3D7LvLlDtgccID+wQexlTx4LwwAKG/XOey0u2Ntb0jszDQ00Bclp1qLGGaDOiSNunt4NSbv3zOU0llgGIJ3BmCqtQhK6TRY3q5j/LLUjsOHnTZDc/wuAOQ0XP+w6N0UzTzBzBLLAEi3BqB0AyDzKYP9l9SeASjlOt4enh+72XcGOI3DU18XsOQXo7Qz0xhMEfzxaD3xXckYgk9UBXamJ5woYIjdmVI0SprYEZr8toDsv7FQLCfvrQ/YnV6npI6QdOlv5xJgKqkTXfDePMGsExzg9Rvv7eoPX7dwVQAAAABJRU5ErkJggg==",
|
|
21
|
-
"notion.so": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAEmElEQVR42uVb4XGrMAyW3/V/3AniDUo3MBOUDUomKJ0gZALYADpBsgFkAtjAMAF0Ar0/jxwFg02AQni640gv4EhfJfmzJRP4JUHEzq/uGI4AABBCRutFJjQGYRkhY4AgCgOXMurXQCASw1dldJZlt8+UUqCUTgoE+S3jy7K8XVmWQVmW8P39ffu7Mrb+XFmWrXE452DbNry/v08CQh0AHPpfybLs9jnP85by9eemFtu2wfO8Po/QBwIRARsihEDHcZBzjoZhIGMMKaX4z0tWcTHGMEkS7BE9D2g+maYpmKYpdcEphDF2u1dxXV37/V76XZZlkKYpnE6nlke5rgvH4/EuT5ACYJomxHGsNKSuYFPhLkMUSUxLXNeF0+nUAjWKohu4g4CQ+E3L1c7nM0ZRhEIIFELg0iKEQMbYDz0ppej7/vCQ0AFgDUbLQLBtu6Wvbdu9+g4GoEL3fD7jGsXzvFaCZoxhGIZ6IOgAUF2u664SBCGEdJZyHAeLoujEQJoEVfOnZVngeV5fwhnF+po8oiJMdXJUJ00qrtGVIEmVFocCUA3qui68vb0BpbRXuTzPWwRKdp9TOOcQRdF0ADyiNEOfEEKeHtmgOqGq3wEA4jjW8qxFAKgToqby1Xe73a5FoJrv9Ekcx2Ca5n1UeEgIUErBsqwfilUsUGbAFExwwCaBMgQGT4PNK4oiXKs0dZXNg6M9YMAqeoltIqUH/IH/XB5iFrhcLnC9Xlukp7pzziEIgvUBEMcxXK/XltJ1Vue6Lnx8fHSOEYYhHA6H3t95eXkZTRDuToJdEgSB1vuU0t6Vm+d5yDlvLX0BAIMgUK36lElwNgA459pjcM4nyeqrAqAoChRCYBRFWuMoNjIeD4Ch46lCYS4AVjMNlmWpTHZzrpIW9wCdUNhMCMgyuk4obAYAVWLsmhU2AwAiomVZg0NhUwAURdFbaqOUtjYzNwVAxfL6xrYsa9sA6DDGei1ikwB07efLQmGTRIgxBo7j9BKkZiH04YmQTPq4QdfUuYkQqETFDWQAbQoARETHcSb97YcDoCgKZShsdjVY1RHu3dt7+CRYFxVN3mwI6HKD2UNg6rr/Pdygp+tr/hBwXXdWD1D09mnT5NlCQLVSG6JE1/xOKUXLsnr3AVWhMCUAINuPHwOA7/tKEHW2w5MkaY1DKcXj8ThdcbSrV/jz8xN837+rOHo4HCCOY2n9f7/fg2EYwDnX7h26XC4AAGAYBhiGoVVm1y6Pd3lBURRoGMboHLD68nhfy3yWZfD6+trZN7yp8vi/F0hzSlqEnY2UNE1HHZnRzgdLe0DzjEJZlpDnOfi+32qSknlA35mhlmWyLvIoirST2djGSNk7Y9vkiOLhVj4wTfMHstWOzm63m6Srcy4xDAOSJBl2pEQ2M+hWe9d2BUEw/DgJdMxzuiQJVnCkxrKsrk42/YOTMrRs24avr6/Zu0C7eg2rRsrmqRTdxVzl/k8DTpdhs3fn+fkZwjBsJaOmMjLlms2UTYPnpgiDj872nSusktpvd4JOccqUDF02P3BLoDTpk3v2DtZklC4Nnuv0OC6p/BTyFxmRx6YRUfIyAAAAAElFTkSuQmCC",
|
|
22
|
-
"linear.app": "data:image/png;base64,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",
|
|
23
|
-
"vercel.com": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAACMUlEQVR42u3ZLa+yYBgH8Os8nqKbjY2RCAYMWHXTIgaKm4FCsBFJJJMfgG9Aur+DnXwHGo1iYCYyATfHdp10zjzu2c458ipc/83mG7/7ut/fAAChx/kHPQ8BEAABEAABEAABEAABEAABEAAB1B1FUUBV1cYRsKlXkiTIOccm/0NjAJZlYZ7niIhoWVa/AARBwCiK8DNRFKEkSf0BcF0Xsyz7AsiyDF3X7QeApmkYhiE+JgxDVFW1+wCMsa++f588z9HzvG4D6Lr+re8/Jo5jNE2zuwCMMfwpjLFuAjiO89/Sf0ySJLVOi7WsBGVZhvV6DYPB4Mf3iqIIu90OZFnuzkrQtu1ftf79gGjbdje6gCRJGAQB/jVBEKAgCK8PcDwe8dnUNBZU+wNpmj4NkCTJaw+Ch8MBxuPx058XRRE8z6t0AHyDCq/H0zQtBAAAcL1eYTQavd6BSBiGhR8eAGA4HMLpdHqtadA0zUJ9/zFpmla5RC7/SznnWHY455VMi6V3AcdxYDKZlF6ms9kMLMtqdxeYz+eVtP5nfN9HRVHaWwGGYcBisahssFqtVrDf79tZAVW3/v35oa7r7asAXddhuVxWvnObTqew2WzaVQGGYfxpt1c0cRyXVgWlVMB2u/3VXr/M8wXTNNtRAZqm1dr692cGhmE0vxDyfR+bShAEhQHei5bP+XyGy+XSyKXm7XZr926QrscJgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIoH35AMeAlc846gXqAAAAAElFTkSuQmCC",
|
|
24
|
-
"openai.com": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAFm0lEQVR42u2av2v6ThjHn8+XbwsfcShWqFvTRZycLB3s0MlFaGP/Ae0WKNhJcLJ0ckuhk50UOgecnAuhUHBJu8SlQwtxMtNZ5drhvpPhklxiTo31S3MQSO1pcq88P973PPlDCCHwi8c/8MtHBCACEAGIAEQAIgARgN87/l3XhcbjMby9vcH39zcAAMTjcchkMj9PgIQ8FEUh2WyWAADzkCSJ6LpOfmqEBkBVVSIIgufCnUetViMY47UD+BPGZqjT6cDFxYX1dzabhUqlAoeHh5BMJmE8HsPHxwc8PDxAt9u1zbu+vobn52d4eXmBz89P2NnZgWQyCaenp3BycgKJRGKzXUBRFOupJhIJ0uv1fOcbhkGKxSKXpSCENtMFDMOwbjSbzZLJZDL3O+12m8RiMddCc7kcEUXR0436/f7mARBF0brBeYtXVZUkEgnbokRRJJqmMef3+31SKBRs8+dZ11oB6Lpu3ZiiKL5WQoOaWUvQJ0q7GAAQwzA2A0Cr1bJuijUwxqTRaLhM2Q+W1+j1etb38/n8zwIwTZPIskxSqRQBAFIul31veHY0Gg1fN5mnDWiYqqr+DIBms+lamCzLvosvl8u+ZkvPFwTBc3EIIdtvrhUAQojk83lmdHYCoF3D70npuu4KcnRwZEGTJMmas6iI4gaAMSbpdNq6cLFYJLquW5/5AWCNyWRCarUa00WcnzWbTdtC2+229T/TNNcDoFqt2kTJbMxiAA8AZ0R3Ch3TNG3XAwASi8Ws9Nfv963PvdLnSgHQF6T9DmPMBUDTNJcL5XI5z9jAcg9RFG0WsOiGigsALVlpORoUAMbY9UR5AyRLNTrvJxQApmna/NMZF4IAcB7tdtv2FGlfD6o51hYDVFX19DdeAE4NMJlMuEUSQoiUy2WbmlwkE8AiuzynuQUFIEmSr4kbhmFLbTOl5xfgZFm25lar1c0GEPimGO5SrVY9zZy2BN5sELgo+vfvX+v86+trLeW6YrFond/d3cHu7i7c39+75smybJ3f3t6GUxChU6BT0WGMra1tKpWy7eyWsYB2u00wxi6hVCwWffUJTywAHgXo52vOLa4oisQ0TVuU5wXQarVs8YEurjrdkA7SPMUSLh1A+xormLFSGi14lgHgtCYnADpN8xRKuBoj9XrdOr+8vHT9v1KpAEIIGo2G9dnT09Na4sX29rZ1Pp1Ow+kMZTIZqNVqAADQ7Xbh6urKNScej8PNzQ3oum4LYgAApVIJBoOB5+8PBgMolUpLw6ADdihVYdrfC4WCb25n1f6clV2EEHNHyOMCdJAOLQbQym3eVjVIfPCSwosAoAEGqUYvBYAOOLzylSV56exCZ5ugAOhyPG91CFZRAXamQD/5quu6q1dYKBRs21leAPRWmXdbvBAATdNc0pPVC5QkyZKvCCHmVpiVsoIAmLkbnZrpAk2oAGiTcy6AtftjLdwvZswDkEqliKqqJJfL+arDtQRBFnWEkGtXt0hV2M8C5knj0MvitOl5RV269JVOp33Tk67rrjKZ07rora8XpLUBoLX3vAqO3xNnaYB0Os0soc+sShAE0mq1Fq4CrawxQkffRRqVLA3g90Rp/UA2oT1OB0OeG1NV1dZbmFfwcBZklm2IrrQ3SLvCTAP0ej1mXNA0zaUZcrnc3Ny9qjZYaN1hWhg5mxiiKNrSFe3nQdwGIWSzllX4fSjtcYwxs1nqdeTz+blPXlVVWx9gmS4wWddLUtPpFB4fH+H5+Rne399hNBrB1tYWHB0dwfHxMdTrdVuNQBRFODs7g729PTg4OIDRaAT9fh86nQ68vr5a8xRFgfPz8//fe4LLWoogCCt7H2it7wkGySB+ILLZ7EJvj2zEe4K8YzgcwnA4tCpK+/v7fFWdJcZGAIjeFo8ARAAiABGACEAEIAIQAfiB8R/yJaxaNgYgiwAAAABJRU5ErkJggg==",
|
|
25
|
-
"anthropic.com": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAFyElEQVR42u2aXWwUVRTH/53ZmS2lJV3Zgg8WAiIoFsGPhHRbtOxWkAai9AMeQAR9wIT0AYKWYCLBhKatRNw2BFChgHRDKaWoQUXaUmxpX+TLAIqxGBITVKbuSmntnd3b8cHUMDt3Zne2u7CGuclNms65s5t//+d35pxpikwGFDzAi8MDviwBLAEsASwBLAEsASwBLAEsASwBLAEsAR7IZUvUjXme171GKY3bmaQUgOd5SJIEvz/AvD5x4gSMHTtWc+by5cuw21M18Q5HJpxOZ0JESEnEQEQQ05CX50J3dw/zenn5OtTW1iIoD911JhV5efnMMy5XLs6e7UZQHkx+AXiex40bNzD10RlwOsczYySpD4MDf8Fms6nOdXScgadwoeacJPXheu81TJ48Oe4uiDsEOZ5HU1NzxLiWluMQRFGV426PWzffm5qawfHC/8MBvC0VDkemLtQIIcjOzsaVK1dVthZEETXV76Ni02aVCyil8PsDoKGh5HaAIIro6DgTkeh2ux1Xr/6A7y+dU8UNU4qyshLd6vDV1ydVrknCFLDB661DRkZ6VNENvsMqW1NKMWXqdBQWekAIUcVmZKTjoz0fx71wxS0FRkrfxIcf0UCMEAK73c6EoUwGNC46ceJLLF78MhOGv//2a1xLIhdP+Pl8h5n5PmvWLN1zTU1HVbYOyjIWvbRQF4Y+32FwBul13xwgiCJSUgQN/CSpDw2HDuDn3l5s2fKe6q9KCMFj06bh3PkLYTBMRU11tS4MFSWIoCwnjwN4nkd7W7su/IqKFmH5smVMGJ6/cBHXfrwSBsOgIQzb29oNIXvPBeB4O3bt3sPM8dLSYmQ6sjDj8Scxc+YTGrgBwL76/UwYuly5zHivtw4cb0+OFDCCnyT1oa31JAoKXviXEQ0+rFj5GjPufsGQiwf8WlqO63Zvbo8blFIMU4qiokW69/nmVKsGhgteLNSNjxcMuXhk0Vtvb4LDkan6rd8fQHVVpUqQTEcW3nh9DSSpT1PjKyurNDVeEFOxdeu7mniHIxPrN2y8/wzgeR5dXd+iv/8OE0plZSUYvsuiw5Rg9ZpVTBh2d/fgl+s/aWD46soVujDs6uoaNQy50cLP661j1n6XKxdTpk5X5SilFPn5z+vW+E8PNTBh+MzTcxIGw5ghyPM8bt++DcdDE5iQaj7aiOKSYk29FkQRH+7wYv2GjVE1PIIo4ljzMZSULk8IDLnRwK+x8Yju9eKSUgA2CGKaagM2rF69KuqGJyjLWLJksWFbPRoYxuwAQUxDVpbT8DnfaLHaZUII5s6di1OnWjVPhhUVFaip2a55krTb7bh1S4p5WhSTADzPo7unB/Pmzded+kSypB68WNOfkXnh7DnPMdOgs/M0XLm5MaUBFyv89tcfjDwYMdhGK3z6QynFU7Of1YXh/vqDMcPQtAOM4BePZQRDoydJ/59/YNy4caZdYIsn/Agh6O+/Y+p+4SwY+bmj4wzcHvd/VSQoy1i69BXd+zQ2HsHaN9eaFsC0AwQxDZMmZSMQCKjgN9La5uXnmfoCbW3tuHnzpkoEQgjmFxTgs8+/SDgMTQkQCUZtrSfh9iwAMBw1gnwNB3VtHV7jI33+pYvfIScnx5QLOHP2F/DJ3nrDxicoDyIoD0W5Bw1tHd7wjMBQr62urd1pGoamBPh78A7q6nZq1A9vfMysMWnpzAZJv+EJ4Z3NmzSscTrHY+++egT8t0z1B5yZkRer7dVrfKJdwzTIbJD0pj/RwJBLhACADdsqqzQjb0IICgs9msbHTNnLzy9ARkY68/yu3Xs0th6Tlo7y8nXMtnobo602XDIZUCJtGhpSOjtPKwCYu/loo6IoQSWae7G2ogSVHR9s173/9d5rCg0NRf19OjtPq+KNdtRVIBQKwehNTzzm9EafcfeL1JEUYYFQL/6evh6H9S8ylgCWAJYAlgCWAJYAlgCWAJYAlgCWAJYAlgCWAMm8/gEhn8vUQKmmGwAAAABJRU5ErkJggg==",
|
|
26
|
-
};
|