gitifact 0.8.5 → 0.8.6
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/browser/assets/{HgiRefresh-BSPkIVFZ.js → HgiRefresh-CnBE2KZ8.js} +1 -1
- package/dist/browser/assets/{Markdown-B1P3lpA0.js → Markdown-75QVB57V.js} +1 -1
- package/dist/browser/assets/{Selector-BG3Gd_OR.js → Selector-E8jyEKNB.js} +1 -1
- package/dist/browser/assets/Tab-C-PhLRIZ.js +4 -0
- package/dist/browser/assets/{Table-DjTkmoR7.js → Table-Cr2jvka_.js} +1 -1
- package/dist/browser/assets/{Token-D337a1e3.js → Token-BBk7tRek.js} +1 -1
- package/dist/browser/assets/{about-D06ipt4C.js → about-C3ewDfU2.js} +1 -1
- package/dist/browser/assets/{activity-timeline-Bl6a55GR.js → activity-timeline-B3s0viEt.js} +2 -2
- package/dist/browser/assets/changelog-DkRd6I8J.js +1 -0
- package/dist/browser/assets/commit-BHwKZ7hK.js +4 -0
- package/dist/browser/assets/{contributor-D1TZSDq9.js → contributor-CqqvzxLh.js} +1 -1
- package/dist/browser/assets/{contributors-lkpVuCXS.js → contributors-CuMPZx6_.js} +1 -1
- package/dist/browser/assets/{contributors._email-B7ATmxN1.js → contributors._email-CEcZZfAR.js} +1 -1
- package/dist/browser/assets/{contributors.index-Cc0QRJwQ.js → contributors.index-DNMBFxLb.js} +1 -1
- package/dist/browser/assets/dashboard.index-nV7KwM5H.js +1 -0
- package/dist/browser/assets/{document-7jVYmB_Z.js → document-BnxE7Txb.js} +1 -1
- package/dist/browser/assets/{document-kGFspd5u.js → document-odLLdugz.js} +1 -1
- package/dist/browser/assets/features-C0YzZiS-.js +2 -0
- package/dist/browser/assets/{features._featureId-DGUBnzjL.js → features._featureId-Cmg8-2ku.js} +1 -1
- package/dist/browser/assets/{features.index-Dgw4kiMG.js → features.index-CBz7BmRW.js} +1 -1
- package/dist/browser/assets/{getting-started-B_LeBSZE.js → getting-started-CaOhGSBe.js} +1 -1
- package/dist/browser/assets/git-DwAnKiiN.js +1 -0
- package/dist/browser/assets/{index-IML0_BCy.js → index-BljzO9go.js} +4 -4
- package/dist/browser/assets/{instructions-Qhbd8_KG.js → instructions-DWS_nwe0.js} +1 -1
- package/dist/browser/assets/{instructions._instructionId-CnX6OyFZ.js → instructions._instructionId-l7aWWvfx.js} +1 -1
- package/dist/browser/assets/instructions.agents-t7hMe4Pv.js +1 -0
- package/dist/browser/assets/instructions.index-CHVCQBSH.js +1 -0
- package/dist/browser/assets/{lazyRouteComponent-tJOK5sxC.js → lazyRouteComponent-BZI8yQj_.js} +1 -1
- package/dist/browser/assets/{load-more-DVsjzCxE.js → load-more-BVsXjzHC.js} +1 -1
- package/dist/browser/assets/page-header-CRcXie4p.js +248 -0
- package/dist/browser/assets/{records._recordId-C2qxnLKN.js → records._recordId-DF-NkdBL.js} +1 -1
- package/dist/browser/assets/{records.commits._commit-CSa3sQ8C.js → records.commits._commit-BBf_rxHJ.js} +1 -1
- package/dist/browser/assets/{records.docs._docId-SIPsGTwH.js → records.docs._docId-Diev5opj.js} +1 -1
- package/dist/browser/assets/{records.index-DoE_3GrP.js → records.index-DPWv9blV.js} +1 -1
- package/dist/browser/assets/{records.working-Cp5ualrr.js → records.working-D5xv-dTD.js} +1 -1
- package/dist/browser/assets/{settings-tVQIx1Uf.js → settings-N1hE7l-i.js} +1 -1
- package/dist/browser/assets/{useInfiniteQuery-C0rB-9Ci.js → useInfiniteQuery-CrEm5UW2.js} +1 -1
- package/dist/browser/assets/{useKeyboardHint-D5jGavym.js → useKeyboardHint-CGJ2GVT3.js} +1 -1
- package/dist/browser/index.html +20 -20
- package/dist/i18n/en/changelog.md +11 -0
- package/dist/i18n/en/docs/spec.md +79 -3
- package/dist/i18n/ko/changelog.md +11 -0
- package/dist/i18n/ko/docs/spec.md +79 -3
- package/dist/main.js +140 -62
- package/package.json +1 -1
- package/dist/browser/assets/Tab-RKLZrCiK.js +0 -1
- package/dist/browser/assets/changelog-DCvEVceR.js +0 -1
- package/dist/browser/assets/commit-Cj7mcn9u.js +0 -4
- package/dist/browser/assets/dashboard.index-BNTyn3_V.js +0 -1
- package/dist/browser/assets/features-CBeEOrok.js +0 -2
- package/dist/browser/assets/git-DW-pzDOm.js +0 -1
- package/dist/browser/assets/instructions.agents-0tKcPahQ.js +0 -1
- package/dist/browser/assets/instructions.index-B3v6vtEg.js +0 -1
- package/dist/browser/assets/page-header-AS8jZ1ve.js +0 -248
|
@@ -1 +1 @@
|
|
|
1
|
-
import{l as e}from"./themeProps-CkLe5zXY.js";import{o as t}from"./commit-
|
|
1
|
+
import{l as e}from"./themeProps-CkLe5zXY.js";import{o as t}from"./commit-BHwKZ7hK.js";import{a as n}from"./index-BljzO9go.js";var r=e();function i(){let{recordId:e}=n.useParams();return(0,r.jsx)(t,{recordId:e})}export{i as component};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{l as e}from"./themeProps-CkLe5zXY.js";import{s as t}from"./commit-
|
|
1
|
+
import{l as e}from"./themeProps-CkLe5zXY.js";import{s as t}from"./commit-BHwKZ7hK.js";import{r as n}from"./index-BljzO9go.js";var r=e();function i(){let{commit:e}=n.useParams(),i=n.useSearch();return(0,r.jsx)(t,{commit:e,search:i})}export{i as component};
|
package/dist/browser/assets/{records.docs._docId-SIPsGTwH.js → records.docs._docId-Diev5opj.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{l as e}from"./themeProps-CkLe5zXY.js";import{n as t,t as n}from"./index-
|
|
1
|
+
import{l as e}from"./themeProps-CkLe5zXY.js";import{n as t,t as n}from"./index-BljzO9go.js";var r=e();function i(){let{docId:e}=n.useParams();return(0,r.jsx)(t,{docId:e})}export{i as component};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{l as e}from"./themeProps-CkLe5zXY.js";import{o as t,s as n}from"./index-
|
|
1
|
+
import{l as e}from"./themeProps-CkLe5zXY.js";import{o as t,s as n}from"./index-BljzO9go.js";var r=e();function i(){let e=t.useSearch(),i=t.useNavigate();return(0,r.jsx)(n,{search:e,change:(e,t)=>{i({search:e,replace:t??!1})}})}export{i as component};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{l as e}from"./themeProps-CkLe5zXY.js";import{a as t}from"./commit-
|
|
1
|
+
import{l as e}from"./themeProps-CkLe5zXY.js";import{a as t}from"./commit-BHwKZ7hK.js";import{i as n}from"./index-BljzO9go.js";var r=e();function i(){let e=n.useSearch();return(0,r.jsx)(t,{search:e})}export{i as component};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{K as t,l as n,n as r,q as i}from"./themeProps-CkLe5zXY.js";import{n as a}from"./useIsomorphicLayoutEffect-BiEJxDg_.js";import{_t as o,an as s,bt as c,cn as l,gt as u,hn as d,mn as f,pn as p,sn as m,t as h,un as g}from"./page-header-AS8jZ1ve.js";import{a as _}from"./useMediaQuery-twbHF0pO.js";import{E as v,S as y,W as b,w as x}from"./Icon-DPaLmsmh.js";import{t as S}from"./useKeyboardHint-D5jGavym.js";import{a as C,c as w,l as T,n as E,o as D,r as O}from"./appearance-DyJA06C4.js";import{n as k,t as A}from"./Grid-DCCm_m5g.js";var j=e(i(),1),M=(0,j.createContext)(null);M.displayName=`SegmentedControlContext`;function N(){let e=(0,j.use)(M);if(e==null)throw Error(`useSegmentedControlContext must be used within SegmentedControl. Wrap your SegmentedControlItem in <SegmentedControl>.`);return e}var P=n(),F={container:{k1xSpc:`x3nfvp2`,kGNEyG:`x6s0dn4`,kOIVth:`x1lsbc85`,"--_segmented-control-padding":`x18jk3ff`,kmVPX3:`xpoxszi`,kWkggS:`x17x4s8c`,$$css:!0},fill:{k1xSpc:`x78zum5`,kzqmXN:`xh8yej3`,$$css:!0},disabled:{kSiTet:`xbyyjgo`,kfzvcC:`x47corl`,$$css:!0},disabledWithMessage:{kSiTet:`xbyyjgo`,$$css:!0}},I={sm:{"--_segmented-control-radius":`x9icjy1`,kaIpWk:`x1hapoqb`,$$css:!0},md:{"--_segmented-control-radius":`x9icjy1`,kaIpWk:`x1hapoqb`,$$css:!0},lg:{"--_segmented-control-radius":`x9icjy1`,kaIpWk:`x1hapoqb`,$$css:!0}};function L({ref:e,value:n,onChange:i,label:o,size:s,layout:u=`hug`,isDisabled:d=!1,disabledMessage:f,children:p,xstyle:m,className:h,style:g,onKeyDown:b,onFocus:x,onBlur:C,...w}){let T=y(s,`md`),E=d&&!!f,D=a({placement:`above`,focusTrigger:`always`,isEnabled:E}),{listRef:O,handleKeyDown:k,handleFocus:A}=c({itemSelector:`[role="radio"]:not([aria-disabled="true"])`,hasRovingTabIndex:!0,wrap:!0,orientation:`horizontal`}),N=S({orientation:`horizontal`,isEnabled:!d}),L=(0,j.useCallback)(e=>{b?.(e),!e.defaultPrevented&&(N.onKeyDown(e),k(e))},[b,N,k]),R=(0,j.useCallback)(e=>{if(x?.(e),e.defaultPrevented||(N.onFocus(e),A(e),d)||!e.currentTarget.contains(e.relatedTarget))return;let t=e.target?.closest(`[role="radio"][data-value]`);if(!t||t.getAttribute(`aria-disabled`)===`true`)return;let r=t.dataset.value;r!=null&&r!==n&&i(r)},[x,N,A,d,i,n]),z=(0,j.useMemo)(()=>({value:n,onChange:i,size:T,layout:u,isDisabled:d,hasDisabledMessage:E}),[n,i,T,u,d,E]);return(0,P.jsxs)(M,{value:z,children:[(0,P.jsxs)(`div`,{ref:v(e,O,D.ref),...w,role:`radiogroup`,"aria-label":o,"aria-disabled":d||void 0,"aria-describedby":E?D.describedBy:void 0,onKeyDown:L,onFocus:R,onBlur:l(C,N.onBlur),..._(r(`segmented-control`,{size:T}),t(F.container,I[T],u===`fill`&&F.fill,d&&(E?F.disabledWithMessage:F.disabled),m),h,g),children:[p,N.hintElement]}),E&&D.renderTooltip(f)]})}L.displayName=`SegmentedControl`;var R={base:{kVAEAm:`x1n2onr6`,k1xSpc:`x3nfvp2`,kGNEyG:`x6s0dn4`,kjj79g:`xl56j7k`,kOIVth:`xzye2dw`,kg3NbH:`xrrkdod`,kWkggS:`xjbqb8w`,kMzoRj:`xc342km`,ksu8eU:`xng3xce`,kMv6JI:`xjb2p0i`,kGuDYH:`xcr08ib`,kLWn49:`x1kq96og`,k63SB2:`x1e4wzip`,kMwMTN:`xv1l7n4`,kkrTdU:`x1ypdohk x16khyan`,khDVqt:`xuxw1ft`,k1ekBW:`x1vix5yk`,kIyJzY:`xuedmi6`,kAMwcw:`xlr8y92`,$$css:!0},hover:{kWkggS:`xoevpu5`,$$css:!0},selected:{kAXs8y:`x1kzknox`,kMwMTN:`x1tgivj0 x1k5gbb1`,k63SB2:`x2mo6ok`,kWkggS:`x10xzikg x1jzqe4`,kGVxlE:`x1i5ehqx`,$$css:!0},disabled:{kkrTdU:`xt0e3qv`,kMwMTN:`xnbbluu`,$$css:!0},fill:{kUk6DE:`x98rzlu`,k7Eaqz:`xeuugli`,kjj79g:`xl56j7k`,$$css:!0},icon:{k1xSpc:`x3nfvp2`,kGNEyG:`x6s0dn4`,kjj79g:`xl56j7k`,kmuXW:`x2lah0s`,$$css:!0}},z={sm:{kZKoxP:`xzj98nu`,kaIpWk:`xc910v0`,kg3NbH:`xf314gf`,kGuDYH:`x141an7d`,$$css:!0},md:{kZKoxP:`x184gfjb`,kaIpWk:`xc910v0`,kg3NbH:`xrrkdod`,$$css:!0},lg:{kZKoxP:`x1uiybsj`,kaIpWk:`xc910v0`,kg3NbH:`xrrkdod`,$$css:!0}},B={sm:{kzqmXN:`x6jxa94`,kZKoxP:`x1v9usgg`,$$css:!0},md:{kzqmXN:`x1kky2od`,kZKoxP:`xlup9mm`,$$css:!0},lg:{kzqmXN:`x1xp8n7a`,kZKoxP:`xmix8c7`,$$css:!0}};function V({ref:e,value:n,label:i,isLabelHidden:a=!1,icon:o,isDisabled:s=!1,onClick:c,xstyle:u,...d}){let f=N(),p=f.value===n,m=s||f.isDisabled,h=p&&(f.hasDisabledMessage??!1)&&!s,g=f.size,v=f.layout===`fill`,y=l(c,()=>{!m&&!p&&f.onChange(n)}),x=o?(0,P.jsx)(`span`,{...t(R.icon,B[g]),children:o}):null;return(0,P.jsxs)(`button`,{ref:e,...d,type:`button`,role:`radio`,"aria-checked":p,"aria-disabled":m||void 0,"aria-label":a?i:void 0,"data-value":n,tabIndex:p&&!m||h?0:-1,onClick:y,..._(r(`segmented-control-item`,{size:g,selected:p?`selected`:null,disabled:m?`disabled`:null}),b.focusVisible(R.base,z[g],v&&R.fill,p&&R.selected,!p&&!m&&R.hover,m&&R.disabled,u)),children:[x,!a&&(0,P.jsx)(`span`,{className:`xb3r6kr xlyipyv xeuugli`,children:i})]})}V.displayName=`SegmentedControlItem`;var H={interactive:{"--selectable-card-ring-color":`x11rj6l1`,kVAEAm:`x1n2onr6`,kkrTdU:`x1ypdohk x16khyan`,k1ekBW:`x16mfhj0`,kIyJzY:`xuedmi6`,kAMwcw:`xlr8y92`,$$css:!0},overlay:{k5JduY:`x1s928wv`,kwXMNM:`x1j6awrg`,kv0HGH:`xarstr8`,kUfP38:`x1k48kgn`,kloYau:`x2q1x1w`,kRicXK:`x1ywzrc5`,kPNhGg:`x97pup0`,kA8PQs:`x1dlmc9c`,ks3ayO:`xyhc2n1`,kAcZsS:`x1k7wiig`,$$css:!0},hoverOnPointer:{k8t4tK:`x1912f9e`,$$css:!0},disabled:{kkrTdU:`xt0e3qv`,kSiTet:`xbyyjgo`,$$css:!0},selected:{kVAM5u:`xad5do`,"--_card-ring":`xr9ms2c`,$$css:!0},selectedBlue:{kVAM5u:`xlee4gx`,"--_card-ring":`xgwwt2v`,$$css:!0},selectedCyan:{kVAM5u:`xb1xfl`,"--_card-ring":`xcdi0x3`,$$css:!0},selectedGray:{kVAM5u:`x1w9ec3u`,"--_card-ring":`x1m1zkwp`,$$css:!0},selectedGreen:{kVAM5u:`xy90a9n`,"--_card-ring":`x1485227`,$$css:!0},selectedOrange:{kVAM5u:`xloqurj`,"--_card-ring":`x1cclxpp`,$$css:!0},selectedPink:{kVAM5u:`x1czkbn8`,"--_card-ring":`xzs6dn4`,$$css:!0},selectedPurple:{kVAM5u:`xq98wne`,"--_card-ring":`x9zgi83`,$$css:!0},selectedRed:{kVAM5u:`xjqgoec`,"--_card-ring":`xo8718j`,$$css:!0},selectedTeal:{kVAM5u:`x1r9gxr1`,"--_card-ring":`xp4e5fy`,$$css:!0},selectedYellow:{kVAM5u:`x1kpnwn1`,"--_card-ring":`x1glw7ee`,$$css:!0},selectedUnknown:{"--_card-ring":`x3zsw4j`,$$css:!0}},U=e=>{switch(e){case`default`:case`transparent`:case`muted`:return H.selected;case`blue`:return H.selectedBlue;case`cyan`:return H.selectedCyan;case`gray`:return H.selectedGray;case`green`:return H.selectedGreen;case`orange`:return H.selectedOrange;case`pink`:return H.selectedPink;case`purple`:return H.selectedPurple;case`red`:return H.selectedRed;case`teal`:return H.selectedTeal;case`yellow`:return H.selectedYellow;default:return H.selectedUnknown}};function W({label:e,isSelected:t,onChange:n,onClick:i,onMouseUp:a,isDisabled:o=!1,children:s,padding:c,variant:l=`default`,elevation:u=`none`,width:d,height:f,maxWidth:p,ref:h,xstyle:g,className:y,style:x,...S}){let C=(0,j.useRef)(null),w=(0,j.useRef)(null),T=(0,j.useCallback)(e=>{o||n(!t)},[o,t,n]),E=(0,j.useCallback)(e=>{!o&&e.key===`Enter`&&(e.preventDefault(),n(!t))},[o,t,n]),{onClick:D,onMouseUp:O}=m({containerRef:C,interactiveRef:w,onClick:T,disabled:o}),A=i?e=>{D(e),i(e)}:D,M=a?e=>{O(e),a(e)}:O;return(0,P.jsxs)(k,{ref:v(h,C),width:d,height:f,maxWidth:p,padding:c,variant:l,elevation:u,..._(r(`selectable-card`,{variant:l,selected:t?`true`:`false`}),b.focusWithin(),y,x),xstyle:[H.interactive,t&&U(l),!o&&H.overlay,!o&&H.hoverOnPointer,o&&H.disabled,g],onClick:o?void 0:A,onMouseUp:o?void 0:M,...S,children:[(0,P.jsx)(`input`,{ref:w,type:`checkbox`,checked:t,"aria-label":e,disabled:o,onChange:()=>n(!t),onKeyDown:E,className:`x10l6tqk x1i1rx1s xjm9jq1 x1717udv xkdpibf xb3r6kr xzpqnlu xuxw1ft xc342km`}),s]})}W.displayName=`SelectableCard`;var G={page:`_page_1yxii_2`,column:`_column_1yxii_3`,pageTitle:`_pageTitle_1yxii_4`,sections:`_sections_1yxii_5`,section:`_section_1yxii_5`,swatches:`_swatches_1yxii_8`,sample:`_sample_1yxii_9`,sampleSurface:`_sampleSurface_1yxii_10`,sampleDot:`_sampleDot_1yxii_11`,sampleLine:`_sampleLine_1yxii_12`},K=()=>({system:g(`settings.mode.system`),light:g(`settings.mode.light`),dark:g(`settings.mode.dark`)}),q=()=>({stone:[g(`settings.palette.stone`),g(`settings.palette.stoneHint`)],sage:[g(`settings.palette.sage`),g(`settings.palette.sageHint`)],olive:[g(`settings.palette.olive`),g(`settings.palette.oliveHint`)],slate:[g(`settings.palette.slate`),g(`settings.palette.slateHint`)],clay:[g(`settings.palette.clay`),g(`settings.palette.clayHint`)]}),J=e=>e===`stone`?w:O[e],Y=[0,1];function X(){f();let{mode:e,palette:t}=T(),n=d();return(0,P.jsxs)(o,{gap:0,className:G.page,children:[(0,P.jsx)(h,{trail:[{label:g(`settings.title`)}]}),(0,P.jsxs)(o,{gap:0,className:G.column,children:[(0,P.jsxs)(o,{gap:1,className:G.pageTitle,children:[(0,P.jsx)(s,{level:1,children:g(`settings.title`)}),(0,P.jsx)(x,{type:`supporting`,color:`secondary`,children:g(`settings.subtitle`)})]}),(0,P.jsxs)(o,{gap:0,className:G.sections,children:[(0,P.jsxs)(o,{as:`section`,gap:3,className:G.section,"aria-label":g(`settings.language`),children:[(0,P.jsx)(o,{gap:1,children:(0,P.jsx)(s,{level:2,children:g(`settings.language`)})}),(0,P.jsx)(u,{gap:0,children:(0,P.jsxs)(L,{label:g(`settings.language`),value:n,onChange:e=>p(e),children:[(0,P.jsx)(V,{value:`system`,label:g(`settings.language.system`)}),(0,P.jsx)(V,{value:`en`,label:`English`}),(0,P.jsx)(V,{value:`ko`,label:`한국어`})]})})]}),(0,P.jsxs)(o,{as:`section`,gap:3,className:G.section,"aria-label":g(`settings.mode`),children:[(0,P.jsxs)(o,{gap:1,children:[(0,P.jsx)(s,{level:2,children:g(`settings.mode`)}),(0,P.jsx)(x,{type:`supporting`,color:`secondary`,children:g(`settings.modeHint`)})]}),(0,P.jsx)(u,{gap:0,children:(0,P.jsx)(L,{label:g(`settings.mode`),value:e,onChange:e=>D({mode:e}),children:E.map(e=>(0,P.jsx)(V,{value:e,label:K()[e]},e))})})]}),(0,P.jsxs)(o,{as:`section`,gap:3,className:G.section,"aria-label":g(`settings.palette`),children:[(0,P.jsxs)(o,{gap:1,children:[(0,P.jsx)(s,{level:2,children:g(`settings.palette`)}),(0,P.jsx)(x,{type:`supporting`,color:`secondary`,children:g(`settings.paletteHint`)})]}),(0,P.jsx)(A,{columns:{minWidth:176,repeat:`fit`,max:5},gap:3,children:C.map(e=>{let n=J(e),[r,i]=q()[e];return(0,P.jsx)(W,{label:r,isSelected:t===e,onChange:t=>{t&&D({palette:e})},children:(0,P.jsxs)(o,{gap:3,children:[(0,P.jsx)(o,{gap:0,className:G.swatches,"aria-hidden":`true`,children:Y.map(e=>(0,P.jsx)(u,{gap:2,vAlign:`center`,className:G.sample,style:{background:n.body[e]},children:(0,P.jsxs)(u,{gap:2,vAlign:`center`,className:G.sampleSurface,style:{background:n.surface[e],color:n.text[e]},children:[(0,P.jsx)(o,{gap:0,className:G.sampleDot,style:{background:n.accent[e]}}),(0,P.jsx)(o,{gap:0,className:G.sampleLine,style:{background:n.text[e]}})]})},e))}),(0,P.jsxs)(o,{gap:1,children:[(0,P.jsx)(x,{type:`label`,children:r}),(0,P.jsx)(x,{type:`supporting`,color:`secondary`,children:i})]})]})},e)})})]})]})]})]})}var Z=X;export{Z as component};
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{K as t,l as n,n as r,q as i}from"./themeProps-CkLe5zXY.js";import{n as a}from"./useIsomorphicLayoutEffect-BiEJxDg_.js";import{_t as o,an as s,bt as c,cn as l,gt as u,hn as d,mn as f,pn as p,sn as m,t as h,un as g}from"./page-header-CRcXie4p.js";import{a as _}from"./useMediaQuery-twbHF0pO.js";import{E as v,S as y,W as b,w as x}from"./Icon-DPaLmsmh.js";import{t as S}from"./useKeyboardHint-CGJ2GVT3.js";import{a as C,c as w,l as T,n as E,o as D,r as O}from"./appearance-DyJA06C4.js";import{n as k,t as A}from"./Grid-DCCm_m5g.js";var j=e(i(),1),M=(0,j.createContext)(null);M.displayName=`SegmentedControlContext`;function N(){let e=(0,j.use)(M);if(e==null)throw Error(`useSegmentedControlContext must be used within SegmentedControl. Wrap your SegmentedControlItem in <SegmentedControl>.`);return e}var P=n(),F={container:{k1xSpc:`x3nfvp2`,kGNEyG:`x6s0dn4`,kOIVth:`x1lsbc85`,"--_segmented-control-padding":`x18jk3ff`,kmVPX3:`xpoxszi`,kWkggS:`x17x4s8c`,$$css:!0},fill:{k1xSpc:`x78zum5`,kzqmXN:`xh8yej3`,$$css:!0},disabled:{kSiTet:`xbyyjgo`,kfzvcC:`x47corl`,$$css:!0},disabledWithMessage:{kSiTet:`xbyyjgo`,$$css:!0}},I={sm:{"--_segmented-control-radius":`x9icjy1`,kaIpWk:`x1hapoqb`,$$css:!0},md:{"--_segmented-control-radius":`x9icjy1`,kaIpWk:`x1hapoqb`,$$css:!0},lg:{"--_segmented-control-radius":`x9icjy1`,kaIpWk:`x1hapoqb`,$$css:!0}};function L({ref:e,value:n,onChange:i,label:o,size:s,layout:u=`hug`,isDisabled:d=!1,disabledMessage:f,children:p,xstyle:m,className:h,style:g,onKeyDown:b,onFocus:x,onBlur:C,...w}){let T=y(s,`md`),E=d&&!!f,D=a({placement:`above`,focusTrigger:`always`,isEnabled:E}),{listRef:O,handleKeyDown:k,handleFocus:A}=c({itemSelector:`[role="radio"]:not([aria-disabled="true"])`,hasRovingTabIndex:!0,wrap:!0,orientation:`horizontal`}),N=S({orientation:`horizontal`,isEnabled:!d}),L=(0,j.useCallback)(e=>{b?.(e),!e.defaultPrevented&&(N.onKeyDown(e),k(e))},[b,N,k]),R=(0,j.useCallback)(e=>{if(x?.(e),e.defaultPrevented||(N.onFocus(e),A(e),d)||!e.currentTarget.contains(e.relatedTarget))return;let t=e.target?.closest(`[role="radio"][data-value]`);if(!t||t.getAttribute(`aria-disabled`)===`true`)return;let r=t.dataset.value;r!=null&&r!==n&&i(r)},[x,N,A,d,i,n]),z=(0,j.useMemo)(()=>({value:n,onChange:i,size:T,layout:u,isDisabled:d,hasDisabledMessage:E}),[n,i,T,u,d,E]);return(0,P.jsxs)(M,{value:z,children:[(0,P.jsxs)(`div`,{ref:v(e,O,D.ref),...w,role:`radiogroup`,"aria-label":o,"aria-disabled":d||void 0,"aria-describedby":E?D.describedBy:void 0,onKeyDown:L,onFocus:R,onBlur:l(C,N.onBlur),..._(r(`segmented-control`,{size:T}),t(F.container,I[T],u===`fill`&&F.fill,d&&(E?F.disabledWithMessage:F.disabled),m),h,g),children:[p,N.hintElement]}),E&&D.renderTooltip(f)]})}L.displayName=`SegmentedControl`;var R={base:{kVAEAm:`x1n2onr6`,k1xSpc:`x3nfvp2`,kGNEyG:`x6s0dn4`,kjj79g:`xl56j7k`,kOIVth:`xzye2dw`,kg3NbH:`xrrkdod`,kWkggS:`xjbqb8w`,kMzoRj:`xc342km`,ksu8eU:`xng3xce`,kMv6JI:`xjb2p0i`,kGuDYH:`xcr08ib`,kLWn49:`x1kq96og`,k63SB2:`x1e4wzip`,kMwMTN:`xv1l7n4`,kkrTdU:`x1ypdohk x16khyan`,khDVqt:`xuxw1ft`,k1ekBW:`x1vix5yk`,kIyJzY:`xuedmi6`,kAMwcw:`xlr8y92`,$$css:!0},hover:{kWkggS:`xoevpu5`,$$css:!0},selected:{kAXs8y:`x1kzknox`,kMwMTN:`x1tgivj0 x1k5gbb1`,k63SB2:`x2mo6ok`,kWkggS:`x10xzikg x1jzqe4`,kGVxlE:`x1i5ehqx`,$$css:!0},disabled:{kkrTdU:`xt0e3qv`,kMwMTN:`xnbbluu`,$$css:!0},fill:{kUk6DE:`x98rzlu`,k7Eaqz:`xeuugli`,kjj79g:`xl56j7k`,$$css:!0},icon:{k1xSpc:`x3nfvp2`,kGNEyG:`x6s0dn4`,kjj79g:`xl56j7k`,kmuXW:`x2lah0s`,$$css:!0}},z={sm:{kZKoxP:`xzj98nu`,kaIpWk:`xc910v0`,kg3NbH:`xf314gf`,kGuDYH:`x141an7d`,$$css:!0},md:{kZKoxP:`x184gfjb`,kaIpWk:`xc910v0`,kg3NbH:`xrrkdod`,$$css:!0},lg:{kZKoxP:`x1uiybsj`,kaIpWk:`xc910v0`,kg3NbH:`xrrkdod`,$$css:!0}},B={sm:{kzqmXN:`x6jxa94`,kZKoxP:`x1v9usgg`,$$css:!0},md:{kzqmXN:`x1kky2od`,kZKoxP:`xlup9mm`,$$css:!0},lg:{kzqmXN:`x1xp8n7a`,kZKoxP:`xmix8c7`,$$css:!0}};function V({ref:e,value:n,label:i,isLabelHidden:a=!1,icon:o,isDisabled:s=!1,onClick:c,xstyle:u,...d}){let f=N(),p=f.value===n,m=s||f.isDisabled,h=p&&(f.hasDisabledMessage??!1)&&!s,g=f.size,v=f.layout===`fill`,y=l(c,()=>{!m&&!p&&f.onChange(n)}),x=o?(0,P.jsx)(`span`,{...t(R.icon,B[g]),children:o}):null;return(0,P.jsxs)(`button`,{ref:e,...d,type:`button`,role:`radio`,"aria-checked":p,"aria-disabled":m||void 0,"aria-label":a?i:void 0,"data-value":n,tabIndex:p&&!m||h?0:-1,onClick:y,..._(r(`segmented-control-item`,{size:g,selected:p?`selected`:null,disabled:m?`disabled`:null}),b.focusVisible(R.base,z[g],v&&R.fill,p&&R.selected,!p&&!m&&R.hover,m&&R.disabled,u)),children:[x,!a&&(0,P.jsx)(`span`,{className:`xb3r6kr xlyipyv xeuugli`,children:i})]})}V.displayName=`SegmentedControlItem`;var H={interactive:{"--selectable-card-ring-color":`x11rj6l1`,kVAEAm:`x1n2onr6`,kkrTdU:`x1ypdohk x16khyan`,k1ekBW:`x16mfhj0`,kIyJzY:`xuedmi6`,kAMwcw:`xlr8y92`,$$css:!0},overlay:{k5JduY:`x1s928wv`,kwXMNM:`x1j6awrg`,kv0HGH:`xarstr8`,kUfP38:`x1k48kgn`,kloYau:`x2q1x1w`,kRicXK:`x1ywzrc5`,kPNhGg:`x97pup0`,kA8PQs:`x1dlmc9c`,ks3ayO:`xyhc2n1`,kAcZsS:`x1k7wiig`,$$css:!0},hoverOnPointer:{k8t4tK:`x1912f9e`,$$css:!0},disabled:{kkrTdU:`xt0e3qv`,kSiTet:`xbyyjgo`,$$css:!0},selected:{kVAM5u:`xad5do`,"--_card-ring":`xr9ms2c`,$$css:!0},selectedBlue:{kVAM5u:`xlee4gx`,"--_card-ring":`xgwwt2v`,$$css:!0},selectedCyan:{kVAM5u:`xb1xfl`,"--_card-ring":`xcdi0x3`,$$css:!0},selectedGray:{kVAM5u:`x1w9ec3u`,"--_card-ring":`x1m1zkwp`,$$css:!0},selectedGreen:{kVAM5u:`xy90a9n`,"--_card-ring":`x1485227`,$$css:!0},selectedOrange:{kVAM5u:`xloqurj`,"--_card-ring":`x1cclxpp`,$$css:!0},selectedPink:{kVAM5u:`x1czkbn8`,"--_card-ring":`xzs6dn4`,$$css:!0},selectedPurple:{kVAM5u:`xq98wne`,"--_card-ring":`x9zgi83`,$$css:!0},selectedRed:{kVAM5u:`xjqgoec`,"--_card-ring":`xo8718j`,$$css:!0},selectedTeal:{kVAM5u:`x1r9gxr1`,"--_card-ring":`xp4e5fy`,$$css:!0},selectedYellow:{kVAM5u:`x1kpnwn1`,"--_card-ring":`x1glw7ee`,$$css:!0},selectedUnknown:{"--_card-ring":`x3zsw4j`,$$css:!0}},U=e=>{switch(e){case`default`:case`transparent`:case`muted`:return H.selected;case`blue`:return H.selectedBlue;case`cyan`:return H.selectedCyan;case`gray`:return H.selectedGray;case`green`:return H.selectedGreen;case`orange`:return H.selectedOrange;case`pink`:return H.selectedPink;case`purple`:return H.selectedPurple;case`red`:return H.selectedRed;case`teal`:return H.selectedTeal;case`yellow`:return H.selectedYellow;default:return H.selectedUnknown}};function W({label:e,isSelected:t,onChange:n,onClick:i,onMouseUp:a,isDisabled:o=!1,children:s,padding:c,variant:l=`default`,elevation:u=`none`,width:d,height:f,maxWidth:p,ref:h,xstyle:g,className:y,style:x,...S}){let C=(0,j.useRef)(null),w=(0,j.useRef)(null),T=(0,j.useCallback)(e=>{o||n(!t)},[o,t,n]),E=(0,j.useCallback)(e=>{!o&&e.key===`Enter`&&(e.preventDefault(),n(!t))},[o,t,n]),{onClick:D,onMouseUp:O}=m({containerRef:C,interactiveRef:w,onClick:T,disabled:o}),A=i?e=>{D(e),i(e)}:D,M=a?e=>{O(e),a(e)}:O;return(0,P.jsxs)(k,{ref:v(h,C),width:d,height:f,maxWidth:p,padding:c,variant:l,elevation:u,..._(r(`selectable-card`,{variant:l,selected:t?`true`:`false`}),b.focusWithin(),y,x),xstyle:[H.interactive,t&&U(l),!o&&H.overlay,!o&&H.hoverOnPointer,o&&H.disabled,g],onClick:o?void 0:A,onMouseUp:o?void 0:M,...S,children:[(0,P.jsx)(`input`,{ref:w,type:`checkbox`,checked:t,"aria-label":e,disabled:o,onChange:()=>n(!t),onKeyDown:E,className:`x10l6tqk x1i1rx1s xjm9jq1 x1717udv xkdpibf xb3r6kr xzpqnlu xuxw1ft xc342km`}),s]})}W.displayName=`SelectableCard`;var G={page:`_page_1yxii_2`,column:`_column_1yxii_3`,pageTitle:`_pageTitle_1yxii_4`,sections:`_sections_1yxii_5`,section:`_section_1yxii_5`,swatches:`_swatches_1yxii_8`,sample:`_sample_1yxii_9`,sampleSurface:`_sampleSurface_1yxii_10`,sampleDot:`_sampleDot_1yxii_11`,sampleLine:`_sampleLine_1yxii_12`},K=()=>({system:g(`settings.mode.system`),light:g(`settings.mode.light`),dark:g(`settings.mode.dark`)}),q=()=>({stone:[g(`settings.palette.stone`),g(`settings.palette.stoneHint`)],sage:[g(`settings.palette.sage`),g(`settings.palette.sageHint`)],olive:[g(`settings.palette.olive`),g(`settings.palette.oliveHint`)],slate:[g(`settings.palette.slate`),g(`settings.palette.slateHint`)],clay:[g(`settings.palette.clay`),g(`settings.palette.clayHint`)]}),J=e=>e===`stone`?w:O[e],Y=[0,1];function X(){f();let{mode:e,palette:t}=T(),n=d();return(0,P.jsxs)(o,{gap:0,className:G.page,children:[(0,P.jsx)(h,{trail:[{label:g(`settings.title`)}]}),(0,P.jsxs)(o,{gap:0,className:G.column,children:[(0,P.jsxs)(o,{gap:1,className:G.pageTitle,children:[(0,P.jsx)(s,{level:1,children:g(`settings.title`)}),(0,P.jsx)(x,{type:`supporting`,color:`secondary`,children:g(`settings.subtitle`)})]}),(0,P.jsxs)(o,{gap:0,className:G.sections,children:[(0,P.jsxs)(o,{as:`section`,gap:3,className:G.section,"aria-label":g(`settings.language`),children:[(0,P.jsx)(o,{gap:1,children:(0,P.jsx)(s,{level:2,children:g(`settings.language`)})}),(0,P.jsx)(u,{gap:0,children:(0,P.jsxs)(L,{label:g(`settings.language`),value:n,onChange:e=>p(e),children:[(0,P.jsx)(V,{value:`system`,label:g(`settings.language.system`)}),(0,P.jsx)(V,{value:`en`,label:`English`}),(0,P.jsx)(V,{value:`ko`,label:`한국어`})]})})]}),(0,P.jsxs)(o,{as:`section`,gap:3,className:G.section,"aria-label":g(`settings.mode`),children:[(0,P.jsxs)(o,{gap:1,children:[(0,P.jsx)(s,{level:2,children:g(`settings.mode`)}),(0,P.jsx)(x,{type:`supporting`,color:`secondary`,children:g(`settings.modeHint`)})]}),(0,P.jsx)(u,{gap:0,children:(0,P.jsx)(L,{label:g(`settings.mode`),value:e,onChange:e=>D({mode:e}),children:E.map(e=>(0,P.jsx)(V,{value:e,label:K()[e]},e))})})]}),(0,P.jsxs)(o,{as:`section`,gap:3,className:G.section,"aria-label":g(`settings.palette`),children:[(0,P.jsxs)(o,{gap:1,children:[(0,P.jsx)(s,{level:2,children:g(`settings.palette`)}),(0,P.jsx)(x,{type:`supporting`,color:`secondary`,children:g(`settings.paletteHint`)})]}),(0,P.jsx)(A,{columns:{minWidth:176,repeat:`fit`,max:5},gap:3,children:C.map(e=>{let n=J(e),[r,i]=q()[e];return(0,P.jsx)(W,{label:r,isSelected:t===e,onChange:t=>{t&&D({palette:e})},children:(0,P.jsxs)(o,{gap:3,children:[(0,P.jsx)(o,{gap:0,className:G.swatches,"aria-hidden":`true`,children:Y.map(e=>(0,P.jsx)(u,{gap:2,vAlign:`center`,className:G.sample,style:{background:n.body[e]},children:(0,P.jsxs)(u,{gap:2,vAlign:`center`,className:G.sampleSurface,style:{background:n.surface[e],color:n.text[e]},children:[(0,P.jsx)(o,{gap:0,className:G.sampleDot,style:{background:n.accent[e]}}),(0,P.jsx)(o,{gap:0,className:G.sampleLine,style:{background:n.text[e]}})]})},e))}),(0,P.jsxs)(o,{gap:1,children:[(0,P.jsx)(x,{type:`label`,children:r}),(0,P.jsx)(x,{type:`supporting`,color:`secondary`,children:i})]})]})},e)})})]})]})]})]})}var Z=X;export{Z as component};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{G as e,J as t,W as n,q as r}from"./page-header-
|
|
1
|
+
import{G as e,J as t,W as n,q as r}from"./page-header-CRcXie4p.js";var i=class extends e{constructor(e,t){super(e,t)}bindMethods(){super.bindMethods(),this.fetchNextPage=this.fetchNextPage.bind(this),this.fetchPreviousPage=this.fetchPreviousPage.bind(this)}setOptions(e){e._type=`infinite`,super.setOptions(e)}getOptimisticResult(e){return e._type=`infinite`,super.getOptimisticResult(e)}fetchNextPage(e){return this.fetch({...e,meta:{fetchMore:{direction:`forward`}}})}fetchPreviousPage(e){return this.fetch({...e,meta:{fetchMore:{direction:`backward`}}})}createResult(e,n){let{state:i}=e,a=super.createResult(e,n),{isFetching:o,isRefetching:s,isError:c,isRefetchError:l}=a,u=i.fetchMeta?.fetchMore?.direction,d=c&&u===`forward`,f=o&&u===`forward`,p=c&&u===`backward`,m=o&&u===`backward`;return{...a,fetchNextPage:this.fetchNextPage,fetchPreviousPage:this.fetchPreviousPage,hasNextPage:r(n,i.data),hasPreviousPage:t(n,i.data),isFetchNextPageError:d,isFetchingNextPage:f,isFetchPreviousPageError:p,isFetchingPreviousPage:m,isRefetchError:l&&!d&&!p,isRefetching:s&&!f&&!m}}};function a(e,t){return n(e,i,t)}export{a as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{V as t,l as n,q as r}from"./themeProps-CkLe5zXY.js";import{u as i}from"./useIsomorphicLayoutEffect-BiEJxDg_.js";import{yt as a}from"./page-header-
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{V as t,l as n,q as r}from"./themeProps-CkLe5zXY.js";import{u as i}from"./useIsomorphicLayoutEffect-BiEJxDg_.js";import{yt as a}from"./page-header-CRcXie4p.js";import{_ as o}from"./Icon-DPaLmsmh.js";var s=e(r(),1),c=n(),l=new Set([`ArrowLeft`,`ArrowRight`,`ArrowUp`,`ArrowDown`]),u={horizontal:[`left`,`right`],vertical:[`up`,`down`],both:[`left`,`right`,`up`,`down`]},d={hint:{kVAEAm:`xixxii4`,kpwlN0:`x1anvkwx`,kogj98:`x1ghz6dp`,kWkggS:`x1prclbq`,kaIpWk:`xh6dtrn`,kGVxlE:`x1i5ehqx`,kLKAdn:`xfsso4q`,kGO01o:`xy143xn`,kZCmMZ:`x12gdq22`,kwRFfy:`x1djylfy`,kGuDYH:`x141an7d`,kLWn49:`x1ltkj2j`,kMwMTN:`xv1l7n4`,khDVqt:`xuxw1ft`,kSiTet:`xg01cxk xofkqq2`,k1ekBW:`xsm4mo9`,kIyJzY:`xx6bhzk`,kzIqYQ:`xd00j3c`,kfzvcC:`x47corl`,$$css:!0}};function f(e={}){let{orientation:n=`horizontal`,dismissAfterMs:r=3e3,isEnabled:f=!0}=e,p=o(),m=(0,s.useRef)(null),h=(0,s.useRef)(!1),g=(0,s.useRef)(!1),_=(0,s.useRef)(()=>{}),v=(0,s.useCallback)(()=>{m.current&&=(clearTimeout(m.current),null)},[]),y=(0,s.useCallback)(()=>{g.current=!0},[]),b=(0,s.useCallback)(()=>{g.current=!1,v(),_.current(null)},[v]),x=i({mode:`context`,onShow:y,onHide:b});_.current=x.ref;let S=(0,s.useCallback)(()=>{h.current=!0,v(),x.hide(),g.current=!1,_.current(null)},[v,x]),C=(0,s.useCallback)(e=>{!h.current&&f&&(_.current(e),x.show(),v(),m.current=setTimeout(()=>{S()},r))},[v,S,r,f,x]);(0,s.useEffect)(()=>()=>{v(),_.current(null)},[v]);let w=(0,s.useCallback)(e=>{if(h.current||!f)return;let t=e.target;if(!t.matches(`:focus-visible`))return;let n=e.currentTarget;e.relatedTarget instanceof Node&&n.contains(e.relatedTarget)||C(t)},[C,f]),T=(0,s.useCallback)(e=>{if(!g.current)return;let t=e.currentTarget;if(e.relatedTarget instanceof Node&&t.contains(e.relatedTarget)){!h.current&&e.relatedTarget instanceof HTMLElement&&_.current(e.relatedTarget);return}S()},[S]),E=(0,s.useCallback)(e=>{g.current&&l.has(e.key)&&S()},[S]),D=(0,c.jsx)(`span`,{className:`x3nfvp2 x6s0dn4 xzye2dw`,children:u[n].map(e=>(0,c.jsx)(a,{keys:e},e))});return{hintElement:x.render((0,c.jsxs)(`span`,{"aria-hidden":`true`,children:[D,(0,c.jsx)(`span`,{className:`x11g1kdw`,children:p(`@astryx.keyboardHint.toNavigate`)})]}),{placement:`below`,alignment:`start`,xstyle:d.hint,style:{marginBlockStart:t[`--spacing-2`]}}),onFocus:w,onBlur:T,onKeyDown:E}}export{f as t};
|
package/dist/browser/index.html
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
crossorigin
|
|
15
15
|
/>
|
|
16
16
|
<title>Gitifact</title>
|
|
17
|
-
<script type="module" crossorigin src="/assets/index-
|
|
17
|
+
<script type="module" crossorigin src="/assets/index-BljzO9go.js"></script>
|
|
18
18
|
<link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-hePW80VL.js">
|
|
19
19
|
<link rel="modulepreload" crossorigin href="/assets/themeProps-CkLe5zXY.js">
|
|
20
20
|
<link rel="modulepreload" crossorigin href="/assets/useIsomorphicLayoutEffect-BiEJxDg_.js">
|
|
@@ -23,35 +23,35 @@
|
|
|
23
23
|
<link rel="modulepreload" crossorigin href="/assets/Icon-DPaLmsmh.js">
|
|
24
24
|
<link rel="modulepreload" crossorigin href="/assets/useScrollLock-D-Y-zHSV.js">
|
|
25
25
|
<link rel="modulepreload" crossorigin href="/assets/container.stylex-rwI38dw9.js">
|
|
26
|
-
<link rel="modulepreload" crossorigin href="/assets/page-header-
|
|
26
|
+
<link rel="modulepreload" crossorigin href="/assets/page-header-CRcXie4p.js">
|
|
27
27
|
<link rel="modulepreload" crossorigin href="/assets/IconButton-Br-4XhQr.js">
|
|
28
28
|
<link rel="modulepreload" crossorigin href="/assets/useDevWarning-Dudfg3qF.js">
|
|
29
|
-
<link rel="modulepreload" crossorigin href="/assets/Table-
|
|
29
|
+
<link rel="modulepreload" crossorigin href="/assets/Table-Cr2jvka_.js">
|
|
30
30
|
<link rel="modulepreload" crossorigin href="/assets/Tooltip-MoU3alsv.js">
|
|
31
31
|
<link rel="modulepreload" crossorigin href="/assets/useClipboard-Cqx6Upy7.js">
|
|
32
|
-
<link rel="modulepreload" crossorigin href="/assets/Markdown-
|
|
32
|
+
<link rel="modulepreload" crossorigin href="/assets/Markdown-75QVB57V.js">
|
|
33
33
|
<link rel="modulepreload" crossorigin href="/assets/appearance-DyJA06C4.js">
|
|
34
|
-
<link rel="modulepreload" crossorigin href="/assets/document-
|
|
34
|
+
<link rel="modulepreload" crossorigin href="/assets/document-odLLdugz.js">
|
|
35
35
|
<link rel="modulepreload" crossorigin href="/assets/HoverCard-Bpt8LVFT.js">
|
|
36
|
-
<link rel="modulepreload" crossorigin href="/assets/Token-
|
|
37
|
-
<link rel="modulepreload" crossorigin href="/assets/HgiRefresh-
|
|
38
|
-
<link rel="modulepreload" crossorigin href="/assets/document-
|
|
36
|
+
<link rel="modulepreload" crossorigin href="/assets/Token-BBk7tRek.js">
|
|
37
|
+
<link rel="modulepreload" crossorigin href="/assets/HgiRefresh-CnBE2KZ8.js">
|
|
38
|
+
<link rel="modulepreload" crossorigin href="/assets/document-BnxE7Txb.js">
|
|
39
39
|
<link rel="modulepreload" crossorigin href="/assets/Section-Z2PuhE6c.js">
|
|
40
|
-
<link rel="modulepreload" crossorigin href="/assets/Selector-
|
|
41
|
-
<link rel="modulepreload" crossorigin href="/assets/lazyRouteComponent-
|
|
42
|
-
<link rel="modulepreload" crossorigin href="/assets/useKeyboardHint-
|
|
43
|
-
<link rel="modulepreload" crossorigin href="/assets/Tab-
|
|
44
|
-
<link rel="modulepreload" crossorigin href="/assets/useInfiniteQuery-
|
|
45
|
-
<link rel="modulepreload" crossorigin href="/assets/load-more-
|
|
46
|
-
<link rel="modulepreload" crossorigin href="/assets/contributor-
|
|
47
|
-
<link rel="modulepreload" crossorigin href="/assets/activity-timeline-
|
|
48
|
-
<link rel="modulepreload" crossorigin href="/assets/commit-
|
|
40
|
+
<link rel="modulepreload" crossorigin href="/assets/Selector-E8jyEKNB.js">
|
|
41
|
+
<link rel="modulepreload" crossorigin href="/assets/lazyRouteComponent-BZI8yQj_.js">
|
|
42
|
+
<link rel="modulepreload" crossorigin href="/assets/useKeyboardHint-CGJ2GVT3.js">
|
|
43
|
+
<link rel="modulepreload" crossorigin href="/assets/Tab-C-PhLRIZ.js">
|
|
44
|
+
<link rel="modulepreload" crossorigin href="/assets/useInfiniteQuery-CrEm5UW2.js">
|
|
45
|
+
<link rel="modulepreload" crossorigin href="/assets/load-more-BVsXjzHC.js">
|
|
46
|
+
<link rel="modulepreload" crossorigin href="/assets/contributor-CqqvzxLh.js">
|
|
47
|
+
<link rel="modulepreload" crossorigin href="/assets/activity-timeline-B3s0viEt.js">
|
|
48
|
+
<link rel="modulepreload" crossorigin href="/assets/commit-BHwKZ7hK.js">
|
|
49
49
|
<link rel="modulepreload" crossorigin href="/assets/Grid-DCCm_m5g.js">
|
|
50
50
|
<link rel="modulepreload" crossorigin href="/assets/MetadataListItem-BEwPg27H.js">
|
|
51
|
-
<link rel="modulepreload" crossorigin href="/assets/features-
|
|
51
|
+
<link rel="modulepreload" crossorigin href="/assets/features-C0YzZiS-.js">
|
|
52
52
|
<link rel="modulepreload" crossorigin href="/assets/search-CbtiuqNx.js">
|
|
53
|
-
<link rel="modulepreload" crossorigin href="/assets/contributors-
|
|
54
|
-
<link rel="modulepreload" crossorigin href="/assets/instructions-
|
|
53
|
+
<link rel="modulepreload" crossorigin href="/assets/contributors-CuMPZx6_.js">
|
|
54
|
+
<link rel="modulepreload" crossorigin href="/assets/instructions-DWS_nwe0.js">
|
|
55
55
|
<link rel="stylesheet" crossorigin href="/assets/page-header-DTEyUWBS.css">
|
|
56
56
|
<link rel="stylesheet" crossorigin href="/assets/document-Drgtj94X.css">
|
|
57
57
|
<link rel="stylesheet" crossorigin href="/assets/Token-CKcN25HT.css">
|
|
@@ -1,3 +1,14 @@
|
|
|
1
|
+
## 0.8.6 - 2026-09-28
|
|
2
|
+
### Added
|
|
3
|
+
- Requirements can be written as use cases (optional). Put `style: usecase` in the frontmatter, write a basic flow and alternative flows (A1…) in the body, and give each acceptance criterion a `Path:` line naming the path it checks. A project that does not use it works as before ("Use-case style" in `guide show spec`).
|
|
4
|
+
- With `"requirementStyle": "usecase"` written into `.gitifact/config.json`, `specs new requirement` writes a use-case skeleton and `style: usecase`. `--style usecase` or `--style default` makes one file differently. `init` and `update` neither write nor change the value.
|
|
5
|
+
- `changes list` and `changes commit` warn `REQUIREMENT_FLOW_FORMAT` (no basic flow, sections out of order) and `REQUIREMENT_PATH_FORMAT` (no `Path:`, a flow that does not exist) for a use-case requirement changed in this work, and `REQUIREMENT_STYLE_MISSING` for a requirement without `style` in a project that writes use cases. They do not block a commit, and `check` does not give them.
|
|
6
|
+
- The browser's feature page puts a "Use case" badge on the number line of a use-case requirement. A change comparison also shows a changed `style`.
|
|
7
|
+
### Changed
|
|
8
|
+
- The browser shows each line indented under a requirement's list item on its own line instead of joining them, so `Condition:` and `Expected:` no longer run together.
|
|
9
|
+
- The history cache is rebuilt once; the first history read after updating takes a little longer.
|
|
10
|
+
- Releases 0.8.5 and earlier cannot read a requirement with the `style` key. Have the team update to 0.8.6 before using use cases (the config's `cli` version notice tells them).
|
|
11
|
+
|
|
1
12
|
## 0.8.5 - 2026-09-27
|
|
2
13
|
### Added
|
|
3
14
|
- The browser has a history page for one document (`/records/docs/<document ID>`). It shows every commit that changed the document, newest first, each record with its title and the start of its decision, and opens the context and alternatives in place. Links such as "Change history of this requirement →" on features, instructions and records lead there.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Requirement format
|
|
3
|
-
description: Feature and requirement files, frontmatter, user stories, scope and constraints and acceptance criteria, where quality targets go, creating, editing and moving
|
|
3
|
+
description: Feature and requirement files, frontmatter, user stories, scope and constraints and acceptance criteria, the optional use-case style, where quality targets go, creating, editing and moving
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
A feature is one folder, `.gitifact/spec/<feature>/`. The feature introduction is `index.md`, each requirement is its own `requirements/<slug>.md`, and the design is the files under `design/` (`gitifact guide show design`). Why a document changed is kept in records (`.gitifact/records/`, `gitifact guide show records`).
|
|
@@ -56,7 +56,7 @@ These IDs and sentences illustrate the structure and are not valid input. The bo
|
|
|
56
56
|
- **`order`:** requirements only. Number them in the order of the feature's use; two in one feature may not share a number. `specs new` uses the folder's highest value plus 10, leaving room to insert between.
|
|
57
57
|
- **Body:** required. Do not use a `#` heading or gitifact comments (`<!-- gitifact-… -->`). The body of a feature's `index.md` states in a paragraph or two what the feature is and where it ends.
|
|
58
58
|
|
|
59
|
-
Put no other keys in the frontmatter. Relations between documents are expressed by a design's `requirements` and `sources`; the folder decides which feature a requirement belongs to.
|
|
59
|
+
A requirement written as a use case also has `style` (see "Use-case style" below). Put no other keys in the frontmatter. Relations between documents are expressed by a design's `requirements` and `sources`; the folder decides which feature a requirement belongs to.
|
|
60
60
|
|
|
61
61
|
Links to other documents are relative to this file (from a requirement to an asset: `../../../assets/flow.png`). The browser opens their destinations. `check` and `changes list` report a missing target as a `MISSING_LINK_TARGET` warning. Warnings do not block a commit.
|
|
62
62
|
|
|
@@ -109,6 +109,82 @@ Apply this to new requirements and those being revised for the current request.
|
|
|
109
109
|
|
|
110
110
|
System-wide quality targets (response time of every query, supported browsers, session expiry) are not repeated per requirement; gather them in one common feature. For example, `.gitifact/spec/quality/` holds one target per requirement, with what can be judged written as acceptance criteria. Do not put them in project instructions: instructions describe how to work, and what the product promises belongs in the specs.
|
|
111
111
|
|
|
112
|
+
## Use-case style (optional)
|
|
113
|
+
|
|
114
|
+
A requirement can also be written as a use case: it walks through the normal flow and every way it branches, and each acceptance criterion names the path it checks. If you do not use it, the default shape above stays as it is and this section can be skipped.
|
|
115
|
+
|
|
116
|
+
- **Marker:** `style: usecase` in the requirement's frontmatter. Without it the requirement has the default shape.
|
|
117
|
+
- **Project default:** write `"requirementStyle": "usecase"` into `.gitifact/config.json` by hand, and `specs new requirement` writes `style: usecase` and a use-case skeleton. `init` and `update` neither write nor change the value. To make one file differently, pass `--style usecase` or `--style default`.
|
|
118
|
+
- **In a project with that value:** a changed requirement without `style` draws the `REQUIREMENT_STYLE_MISSING` warning. A requirement that keeps the default shape says `style: default`.
|
|
119
|
+
|
|
120
|
+
```markdown
|
|
121
|
+
---
|
|
122
|
+
id: R-issued-by-the-CLI
|
|
123
|
+
title: Deleting a post
|
|
124
|
+
description: The author removes their own post
|
|
125
|
+
order: 30
|
|
126
|
+
style: usecase
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
As a post author, I want to delete my post so that I can take back something posted by mistake.
|
|
130
|
+
|
|
131
|
+
### Scope and constraints
|
|
132
|
+
|
|
133
|
+
- A deleted post stays in the trash for 30 days.
|
|
134
|
+
|
|
135
|
+
### Basic flow
|
|
136
|
+
|
|
137
|
+
1. The author chooses delete on the post.
|
|
138
|
+
2. The system asks for confirmation.
|
|
139
|
+
3. When the author confirms, the system moves the post to the trash.
|
|
140
|
+
|
|
141
|
+
### Alternative flows
|
|
142
|
+
|
|
143
|
+
- **A1. Not the author** (at step 1)
|
|
144
|
+
1. The delete button is not shown.
|
|
145
|
+
- **A2. Confirmation cancelled** (at step 3)
|
|
146
|
+
1. The post stays as it is.
|
|
147
|
+
|
|
148
|
+
### Acceptance criteria
|
|
149
|
+
|
|
150
|
+
1. Path: Basic flow
|
|
151
|
+
Condition: The author confirms the deletion.
|
|
152
|
+
Expected: The post leaves the list and shows in the trash.
|
|
153
|
+
2. Path: Basic flow, A2
|
|
154
|
+
Condition: The author cancels the confirmation.
|
|
155
|
+
Expected: The post stays.
|
|
156
|
+
3. Path: A1
|
|
157
|
+
Condition: Another user opens the post.
|
|
158
|
+
Expected: There is no delete button.
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
The body runs: user story, `### Scope and constraints`, `### Preconditions`, `### Basic flow`, `### Alternative flows`, `### Postconditions`, `### Acceptance criteria`. The basic flow and the acceptance criteria are required; the rest only when needed.
|
|
162
|
+
|
|
163
|
+
- **Basic flow:** the normal exchange between the actor and the system as numbered steps, one action per step.
|
|
164
|
+
- **Alternative flows:** `- **A1. Situation** (at step N)`: a number, where it branches and from which step, with its steps below. Errors and exceptions go here too. Say so when a flow returns to the basic flow.
|
|
165
|
+
- **Pre- and postconditions:** what must hold before it starts and after it ends, as `-` items.
|
|
166
|
+
- **Acceptance criteria:** three lines per item, `Path:`, `Condition:` and `Expected:`. The path joins `Basic flow` and this requirement's alternative flow numbers with commas (for example `Path: Basic flow, A2`). Give every path at least one criterion.
|
|
167
|
+
- **Scope:** write the flows as behavior the user can check; screen layout and APIs belong in the design (see "What stays out of a requirement" below). Implementation order and effort stay out of the requirement.
|
|
168
|
+
|
|
169
|
+
For a use-case requirement changed in this commit, `changes list` and `changes commit` warn `REQUIREMENT_FLOW_FORMAT` when the basic flow is missing or the sections are out of order, and `REQUIREMENT_PATH_FORMAT` when a criterion has no `Path:` or names a flow that does not exist. As with the default shape, they do not stop the commit and `check` does not give them.
|
|
170
|
+
|
|
171
|
+
A feature's `index.md` may draw its use-case model as a Mermaid flowchart: the actors, the feature's boundary (`subgraph`) and a use case per requirement, joined. It is optional and the CLI does not check it.
|
|
172
|
+
|
|
173
|
+
````markdown
|
|
174
|
+
## Use-case model
|
|
175
|
+
|
|
176
|
+
```mermaid
|
|
177
|
+
flowchart LR
|
|
178
|
+
writer[Post author]
|
|
179
|
+
subgraph posts[Posts]
|
|
180
|
+
uc1([Creating a post])
|
|
181
|
+
uc2([Deleting a post])
|
|
182
|
+
end
|
|
183
|
+
writer --- uc1
|
|
184
|
+
writer --- uc2
|
|
185
|
+
```
|
|
186
|
+
````
|
|
187
|
+
|
|
112
188
|
## What stays out of a requirement
|
|
113
189
|
|
|
114
190
|
A requirement says what to build, as results the user can check. Keep the following in the design (ui, interface, data). In a requirement, every design or screen change would also change the requirement and add records.
|
|
@@ -119,6 +195,6 @@ A requirement says what to build, as results the user can check. Keep the follow
|
|
|
119
195
|
|
|
120
196
|
Example: instead of "each row shows the applicant, period and status columns", write "the user can tell applications apart by applicant, period and status".
|
|
121
197
|
|
|
122
|
-
Follow `gitifact guide show writing` for prose. Its style rules do not replace the user-story pattern and the condition/expected
|
|
198
|
+
Follow `gitifact guide show writing` for prose. Its style rules do not replace the user-story pattern and the acceptance criteria format above (condition/expected, with a path first in a use case). Write project content in the project's language; the language of these instructions does not change it.
|
|
123
199
|
|
|
124
200
|
Refine the files during the conversation. When an existing requirement changes or one of several options is chosen, write a draft record then (`gitifact guide show records`). Simply adding a requirement needs no record. While changing code and tests, bring requirements into line with the final agreement.
|
|
@@ -1,3 +1,14 @@
|
|
|
1
|
+
## 0.8.6 - 2026-09-28
|
|
2
|
+
### Added
|
|
3
|
+
- 요구사항을 유즈케이스 방식으로 쓸 수 있습니다(선택). 프론트매터에 `style: usecase`를 두고 본문에 기본 흐름·대체 흐름(A1…)을 쓰며, 수용 조건마다 `경로:` 줄로 확인하는 경로를 적습니다. 쓰지 않는 프로젝트는 지금과 같습니다(`guide show spec`의 "유즈케이스 방식").
|
|
4
|
+
- `.gitifact/config.json`에 `"requirementStyle": "usecase"`를 직접 적으면 `specs new requirement`가 유즈케이스 뼈대와 `style: usecase`를 씁니다. `--style usecase`·`--style default`로 파일 하나만 다르게 만들 수 있습니다. `init`·`update`는 이 값을 쓰거나 바꾸지 않습니다.
|
|
5
|
+
- `changes list`와 `changes commit`이 이번에 바뀐 유즈케이스 요구사항에 `REQUIREMENT_FLOW_FORMAT`(기본 흐름 없음, 절 순서)·`REQUIREMENT_PATH_FORMAT`(`경로:` 없음, 없는 흐름)을, 유즈케이스 프로젝트에서 `style`이 없는 요구사항에 `REQUIREMENT_STYLE_MISSING`을 경고합니다. 커밋은 막지 않고 `check`는 내지 않습니다.
|
|
6
|
+
- 브라우저의 기능 상세가 유즈케이스 요구사항의 번호 줄에 "유즈케이스" 표지를 붙입니다. 변경 비교에는 `style` 값이 바뀐 것도 보입니다.
|
|
7
|
+
### Changed
|
|
8
|
+
- 브라우저가 요구사항의 목록 항목 아래 들여 쓴 줄을 이어 붙이지 않고 줄마다 보입니다. `조건:`과 `기대 동작:`이 한 줄로 합쳐 보이던 것이 풀립니다.
|
|
9
|
+
- 이력 캐시를 한 번 다시 만듭니다. 업데이트 뒤 처음 이력을 열 때 시간이 조금 더 걸립니다.
|
|
10
|
+
- `style` 키를 쓴 요구사항은 0.8.5 이하가 읽지 못합니다. 유즈케이스를 쓰기 전에 팀원이 0.8.6으로 올리게 하세요(config의 `cli` 버전 안내가 알립니다).
|
|
11
|
+
|
|
1
12
|
## 0.8.5 - 2026-09-27
|
|
2
13
|
### Added
|
|
3
14
|
- 브라우저에 문서 이력 페이지(`/records/docs/<문서 ID>`)가 생겼습니다. 한 문서를 바꾼 커밋을 최신순으로 보이고, 결정기록은 제목과 결정 첫머리를 보인 뒤 그 자리에서 맥락·대안을 펼칩니다. 기능·지침·기록 상세의 "이 요구사항의 변경 이력 →" 같은 링크가 이 페이지로 옵니다.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: 요구사항 형식
|
|
3
|
-
description: 기능과 요구사항 파일의 구조, 프론트매터, 사용자 스토리·범위와 제약·수용 조건, 품질 목표의 자리, 만들기·고치기·옮기기
|
|
3
|
+
description: 기능과 요구사항 파일의 구조, 프론트매터, 사용자 스토리·범위와 제약·수용 조건, 선택하는 유즈케이스 방식, 품질 목표의 자리, 만들기·고치기·옮기기
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
기능 하나는 `.gitifact/spec/<기능>/` 폴더 하나다. 기능 소개는 `index.md`, 요구사항은 `requirements/<slug>.md`에 하나씩, 설계는 `design/` 아래 파일들(`gitifact guide show design`)이다. 문서가 왜 바뀌었는지는 결정기록(`.gitifact/records/`)이 남긴다(`gitifact guide show records`).
|
|
@@ -56,7 +56,7 @@ order: 10
|
|
|
56
56
|
- **`order`:** 요구사항에만 있다. 기능 안에서 사용 흐름에 맞는 순서로 매기고, 같은 기능에서 겹치면 안 된다. `specs new`는 그 폴더의 최댓값+10을 넣으므로 사이에 끼울 자리가 남는다.
|
|
57
57
|
- **본문:** 비워 둘 수 없다. `#` 제목과 gitifact 주석(`<!-- gitifact-… -->`)을 쓰지 않는다. 기능 `index.md`의 본문은 그 기능이 무엇이고 어디까지인지를 한두 문단으로 쓴다.
|
|
58
58
|
|
|
59
|
-
프론트매터에 다른 키를 두지 않는다. 문서 사이의 관계는 설계의 `requirements`·`sources`로 나타내고, 요구사항이 어느 기능에 속하는지는 폴더가 정한다.
|
|
59
|
+
요구사항은 유즈케이스 방식일 때 `style`을 더 둔다(아래 "유즈케이스 방식"). 프론트매터에 다른 키를 두지 않는다. 문서 사이의 관계는 설계의 `requirements`·`sources`로 나타내고, 요구사항이 어느 기능에 속하는지는 폴더가 정한다.
|
|
60
60
|
|
|
61
61
|
다른 문서로 가는 링크는 이 파일 기준 상대 경로로 쓴다(요구사항에서 에셋으로는 `../../../assets/flow.png`). 브라우저가 해당 페이지로 연결한다. 대상이 없으면 `check`와 `changes list`가 `MISSING_LINK_TARGET` 경고로 알린다. 경고는 커밋을 막지 않는다.
|
|
62
62
|
|
|
@@ -109,6 +109,82 @@ order: 10
|
|
|
109
109
|
|
|
110
110
|
시스템 전체에 해당하는 품질 목표(모든 조회의 응답 시간, 지원 브라우저, 세션 만료 등)는 요구사항마다 되풀이하지 않고 공통 기능 한 곳에 모은다. 예: `.gitifact/spec/quality/`의 요구사항마다 목표 하나를 두고, 판정할 수 있는 것은 수용 조건으로 쓴다. 프로젝트 지침에는 두지 않는다. 지침은 일하는 방식이고, 제품이 지킬 약속은 명세다.
|
|
111
111
|
|
|
112
|
+
## 유즈케이스 방식 (선택)
|
|
113
|
+
|
|
114
|
+
요구사항을 유즈케이스 방식으로 쓸 수도 있다. 정상 흐름과 갈라지는 경우를 빠짐없이 짚고, 수용 조건마다 어느 경로를 확인하는지 적는다. 쓰지 않으면 위의 기본 형식 그대로이고, 이 절은 건너뛴다.
|
|
115
|
+
|
|
116
|
+
- **표지:** 요구사항 프론트매터의 `style: usecase`. 값이 없으면 기본 형식이다.
|
|
117
|
+
- **프로젝트 기본값:** `.gitifact/config.json`에 `"requirementStyle": "usecase"`를 직접 적으면 `specs new requirement`가 `style: usecase`와 유즈케이스 뼈대를 쓴다. `init`·`update`는 이 값을 쓰거나 바꾸지 않는다. 파일 하나만 다르게 만들려면 `--style usecase` 또는 `--style default`를 준다.
|
|
118
|
+
- **이 값을 둔 프로젝트:** 바뀐 요구사항에 `style`이 없으면 `REQUIREMENT_STYLE_MISSING` 경고가 난다. 기본 형식으로 둘 요구사항은 `style: default`를 적는다.
|
|
119
|
+
|
|
120
|
+
```markdown
|
|
121
|
+
---
|
|
122
|
+
id: R-CLI가발급한값
|
|
123
|
+
title: 게시물 삭제
|
|
124
|
+
description: 작성자가 자기 게시물을 지운다
|
|
125
|
+
order: 30
|
|
126
|
+
style: usecase
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
게시물 작성자로서, 잘못 올린 글을 거두기 위해 내 게시물을 지우고 싶다.
|
|
130
|
+
|
|
131
|
+
### 범위와 제약
|
|
132
|
+
|
|
133
|
+
- 지운 게시물은 30일 동안 휴지통에 남는다.
|
|
134
|
+
|
|
135
|
+
### 기본 흐름
|
|
136
|
+
|
|
137
|
+
1. 작성자가 게시물에서 삭제를 누른다.
|
|
138
|
+
2. 시스템이 확인을 묻는다.
|
|
139
|
+
3. 작성자가 확인하면 시스템이 게시물을 휴지통으로 옮긴다.
|
|
140
|
+
|
|
141
|
+
### 대체 흐름
|
|
142
|
+
|
|
143
|
+
- **A1. 작성자가 아님** (1단계에서)
|
|
144
|
+
1. 삭제 버튼을 보이지 않는다.
|
|
145
|
+
- **A2. 확인을 취소함** (3단계에서)
|
|
146
|
+
1. 게시물을 그대로 둔다.
|
|
147
|
+
|
|
148
|
+
### 수용 조건
|
|
149
|
+
|
|
150
|
+
1. 경로: 기본 흐름
|
|
151
|
+
조건: 작성자가 삭제를 확인합니다.
|
|
152
|
+
기대 동작: 게시물이 목록에서 사라지고 휴지통에 보입니다.
|
|
153
|
+
2. 경로: 기본 흐름, A2
|
|
154
|
+
조건: 작성자가 확인 창에서 취소합니다.
|
|
155
|
+
기대 동작: 게시물이 그대로 남습니다.
|
|
156
|
+
3. 경로: A1
|
|
157
|
+
조건: 다른 사용자가 게시물을 엽니다.
|
|
158
|
+
기대 동작: 삭제 버튼이 없습니다.
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
본문은 사용자 스토리, `### 범위와 제약`, `### 사전 조건`, `### 기본 흐름`, `### 대체 흐름`, `### 사후 조건`, `### 수용 조건` 순서다. 기본 흐름과 수용 조건은 필수이고, 나머지는 필요할 때만 둔다.
|
|
162
|
+
|
|
163
|
+
- **기본 흐름:** 행위자와 시스템이 주고받는 정상 흐름을 번호 단계로 쓴다. 한 단계는 한 동작이다.
|
|
164
|
+
- **대체 흐름:** `- **A1. 상황** (N단계에서)`처럼 번호, 갈라지는 상황, 갈라지는 단계를 적고 그 아래에 단계를 쓴다. 오류와 예외도 여기에 둔다. 기본 흐름으로 돌아오면 그렇게 적는다.
|
|
165
|
+
- **사전·사후 조건:** 시작 전에, 끝난 뒤에 참이어야 하는 것을 `-` 목록으로 쓴다.
|
|
166
|
+
- **수용 조건:** 항목마다 `경로:`·`조건:`·`기대 동작:` 세 줄이다. 경로는 `기본 흐름`과 이 요구사항의 대체 흐름 번호를 쉼표로 잇는다(예: `경로: 기본 흐름, A2`). 경로마다 수용 조건이 하나 이상 있게 한다.
|
|
167
|
+
- **범위:** 흐름은 사용자가 확인할 수 있는 동작으로 쓰고, 화면 배치나 API는 설계에 둔다(아래 "요구사항에 두지 않을 것"). 구현 순서나 작업량은 요구사항에 두지 않는다.
|
|
168
|
+
|
|
169
|
+
`changes list`와 `changes commit`은 이번에 바뀐 유즈케이스 요구사항에 기본 흐름이 없거나 절 순서가 다르면 `REQUIREMENT_FLOW_FORMAT`, 수용 조건에 `경로:`가 없거나 없는 흐름을 가리키면 `REQUIREMENT_PATH_FORMAT` 경고를 낸다. 기본 형식과 같이 커밋을 막지 않고 `check`는 내지 않는다.
|
|
170
|
+
|
|
171
|
+
기능 `index.md`에는 유즈케이스 모델을 Mermaid 흐름도로 그려 둘 수 있다. 액터, 기능 경계(`subgraph`), 요구사항마다의 유즈케이스를 잇는다. 선택이며 CLI는 검사하지 않는다.
|
|
172
|
+
|
|
173
|
+
````markdown
|
|
174
|
+
## 유즈케이스 모델
|
|
175
|
+
|
|
176
|
+
```mermaid
|
|
177
|
+
flowchart LR
|
|
178
|
+
writer[게시물 작성자]
|
|
179
|
+
subgraph posts[게시물 관리]
|
|
180
|
+
uc1([게시물 등록])
|
|
181
|
+
uc2([게시물 삭제])
|
|
182
|
+
end
|
|
183
|
+
writer --- uc1
|
|
184
|
+
writer --- uc2
|
|
185
|
+
```
|
|
186
|
+
````
|
|
187
|
+
|
|
112
188
|
## 요구사항에 두지 않을 것
|
|
113
189
|
|
|
114
190
|
요구사항은 무엇을 만들지, 사용자가 확인할 수 있는 결과로 말한다. 아래는 설계(ui·interface·data)에 둔다. 요구사항에 들어가면 설계나 화면을 바꿀 때마다 요구사항과 결정기록까지 바뀐다.
|
|
@@ -119,6 +195,6 @@ order: 10
|
|
|
119
195
|
|
|
120
196
|
예: "행마다 신청자·기간·상태 열을 보여 준다" 대신 "사용자는 신청자·기간·상태로 신청을 구분할 수 있다".
|
|
121
197
|
|
|
122
|
-
본문의 문체는 `gitifact guide show writing`을 따른다. 그 문서의 문체 규칙은 위 사용자 스토리 문형과 `조건: / 기대
|
|
198
|
+
본문의 문체는 `gitifact guide show writing`을 따른다. 그 문서의 문체 규칙은 위 사용자 스토리 문형과 수용 조건 형식(`조건: / 기대 동작:`, 유즈케이스는 앞에 `경로:`)을 대체하지 않는다.
|
|
123
199
|
|
|
124
200
|
대화 중에는 파일을 다듬는다. 기존 요구사항을 바꾸거나 여러 안 중 하나를 고르면 그때 결정기록 초안을 쓴다(`gitifact guide show records`). 새 요구사항을 추가하기만 하면 기록은 필요 없다. 코드와 테스트를 고치는 동안 달라진 요구사항은 마지막 합의 내용으로 맞춘다.
|